机器学习(三) ——k-近邻算法基础

机器学习(三)——k-近邻算法基础

(原创内容,转载请注明来源,谢谢)

一、概述

k近邻算法(kNN),是监督学习的一种,主要用于分类,通过测量不同特征值之间的举例进行分类。

优点:精度高、对异常值不敏感、无数据输入假定。

缺点:计算复杂度高、空间复杂度高。

使用数据范围:数值型和标称型。

二、工作原理

1、原理

存在一个训练样本集,其中每个数据都存在标签,即可以知道数据的每个特征和其对于的分类结果。

现输入没有标签的数据,将新数据的每个特征值和样本集的数据对应特征进行比较,计算出距离最近的前k个数据(k近邻的k的出处)。比较这k个数据,将分类结果出现次数最多的结果,作为最终的结果。k通常不大于20。

2、距离计算公式

假设数据A有n个特征(x11,x12,x13…x1n),数据B的n个特征值为(x21,x22,x23…x2n),则AB两点的距离为

3、knn举例

假设数据有两个特征,数据集3个数,A(1,1,1),特征为x;B(0,1,0),特征为y;C(0,0,1),特征为y。则新加入的一个点D(1,1,0),要确定其特征,则需要计算AD、BD、CD三者的距离,取前k个值(由于这里数据太少,就取第一个值),即为D的特征。

三、kNN实施过程

对于未知类别属性,加入数据集,每次都需要执行以下操作:

1、计算已知类别数据集中的点与当前点之间的距离。

2、按距离的次序从小到大排序。

3、取排序结果的前k个值。

4、确定前k个值出现的频率。

5、返回频率最高的分类,即为分类结果。

四、代码实现(Python)

1、实现部分(文件名kNN.py)

1)引入python的numpy处理库以及operator库

from numpy import *
import operator

2)#训练数据集,特征2个,并且有对应的分类结果

   def createDataSet():
   group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
   labels = ['A', 'A', 'B', 'B']
   return group, labels

3)训练和测试函数,输入待分类数据、训练集、对应分类结果、k值

def classify0(inX, dataSet, labels, k):
    #计算距离
   dataSetSize = dataSet.shape[0]
   diffMat = tile(inX, (dataSetSize, 1)) - dataSet
   sqDiffMat = diffMat**2
   sqDistances = sqDiffMat.sum(axis=1)
   distances = sqDistances**0.5
    #排序
   sortedDistIndicies = distances.argsort()
   classCount = {}
    #取排序结果前k个,确认分类结果出现最多的数据
   for i in range(k):
       voteIlabel = labels[sortedDistIndicies[i]]
       classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    sortedClassCount= sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
returnsortedClassCount[0][0]

4)测试

def testsimpleknn():
   group,labels = createDataSet()
   result = classify0([0,0],group,labels,3)
return result

2、执行

在linux系统,进入python,输入import kNN,kNN.testsimpleknn(),结果是B,表示[0,0]数据会被分到特征值B。

——written by linhxx 2017.12.28

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-12-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专知

【干货】​深度学习中的线性代数

【导读】近日,机器学习专业学生 Niklas Donges 撰写了一篇关于深度学习需要的数学基础相关知识。线性代数对于理解机器学习和深度学习内部原理至关重要,这...

34010
来自专栏大数据挖掘DT机器学习

KMeans聚类算法思想与可视化

1.聚类分析 1.0 概念 聚类分析简称聚类(clustering),是一个把数据集划分成子集的过程,每一个子集是一个簇(cluster),使得簇中的样本彼此...

5006
来自专栏大数据挖掘DT机器学习

机器学习模型的特性

机器学习模型中有许多种不同方法可以用来解决分类和回归问题。对同一个问题来说,这些不同模型都可以被当成解决问题的黑箱来看待。然而,每种模型都源自于不同的...

33111
来自专栏PPV课数据科学社区

这是一份文科生都能看懂的线性代数简介

选自Medium 作者:Niklas Donges 机器之心编译 参与:Tianci LIU、思源 线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深...

32110
来自专栏机器学习从入门到成神

机器学习之从极大似然估计到最大熵原理以及EM算法详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

711
来自专栏技术沉淀

KNN算法实现及其交叉验证

1033
来自专栏企鹅号快讯

机器学习(三)——k-近邻算法基础

机器学习(三) ——k-近邻算法基础 (原创内容,转载请注明来源,谢谢) 一、概述 k近邻算法(kNN),是监督学习的一种,主要用于分类,通过测量不同特征值之间...

18610
来自专栏杂文共赏

蚂蚁金服论文

通常,图表征学习的目标是学习一个函数:f(\mathcal{X},\mathcal{G}) ,利用\mathcal{G}空间中附加的图结构,而不是传统的只考虑f...

4257
来自专栏CreateAMind

adam神经网络优化算法简介

以下内容摘自 http://www.cnblogs.com/xinchrome/p/4964930.html

603
来自专栏MyBlog

数值分析读书笔记(2)求解线性代数方程组的直接方法

我们引入一个一般意义上的初等变换矩阵,它把许多常用的线性变换统一在一个框架里面,在数值线性代数中起着重要的意义

672

扫描关注云+社区