k-近邻算法-机器学习实战例子说明

算法概述

优点
精度高、对异常值不敏感、无数据输入假定。
缺点
计算复杂度高、空间复杂度高。
试用数据范围
数值型和标称型

工作原理:将新数据的每个特征与样本集中数据对应特征进行比较,计算之间的距离值,选取样本数据集中前k个最相似的数据。

伪代码

    计算已知类别数据集中的点与当前点之间的距离
    按照距离递增次序排序
    选取与当前点距离最小的k个点
    确定前k个点所在类别的出现频率
    返回前k个点出现频率最高的类别作为当前点的预测分类

代码如下图所示:

这里写图片描述

from numpy import *
import operator

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 ###上面createDataSet函数创建学习数据

def classify0(inX, data, labels, k):
dataSetSize = data.shape[0] ###dataSetSize=4,为group的行数
diffMat = tile(inX,(dataSetSize,1))-data #tile表示将[0,0]数据复制成4行,即,tile(inX,(dataSetSize,1))=([[0, 0],[0, 0], [0, 0],[0, 0]]),在与data做减法
sqDiffMat=diffMat**2 ###计算上述代码求差后的每个值的平方和
distances = sum(sqDiffMat,axis=1) ###sqDiffMat为四行两列的数据,按照行求和,得到每行的和
sortedDistIndicies = distances.argsort()
classCount={}
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)
return sortedClassCount[0][0]

group,labels=createDataSet()
t=classify0([0,0],group,labels,3)
print(t)

上述程序的执行过程数据如下所示:
输入数据及第17行代码的执行结果如下:
这里写图片描述
python tile函数的作用是将数据按照一定的规则进行复制
用法可参考:https://www.cnblogs.com/zibu1234/p/4210521.html
这里写图片描述
18,19行代码输出如下:
这里写图片描述
20,21行代码输出如下:
argsort()函数按照列表索引排序,从小到大的排序,distances中第3个之最小,索引值为2,最大的值索引为0
具体用法可以参考:https://www.cnblogs.com/yyxf1413/p/6253995.html
这里写图片描述
23-25行的for循环是为了统计前k个sortedDistIndicies中每个labels出现的次数,如本程序中k=3,即统计前3个sortedDistIndicies索引对应的labes出现的次数。
程序中使用了字典的get()函数,该函数的作用是返回指定键的值,没有返回默认值,用法可以参考:
http://www.runoob.com/python/att-dictionary-get.html

统计结果如下:
这里写图片描述
程序中26,27行代码执行的作用是将字典变成列表,然后按照运算符模块itemgetter方法,按照第二个元素的次序对元组进行排序,此处为逆序,即按照从最大到最小次序排序,最后返回发生频率最高的元素标签。
sorted()函数方法参考:
http://blog.csdn.net/ljh0302/article/details/54881930
注意此处使用items()方法。

本人在学习机器学习过程中对程序的一点记录,由于刚接触Python会有很多的不懂,如有错误,请指正,谢谢!

猜你喜欢

转载自blog.csdn.net/happyday_d/article/details/78495206
今日推荐