您的位置:首页 > 其它

Machine Learning In Action

2017-07-19 11:47 381 查看

KNN近邻算法

计算目标点与样本集中的点的距离
按距离递增排序
选取与目标点距离最下的K个点
确定前K个所在类别的频率
返回前K个出现频率最高的类别作为目标点的预测分类

from numpy import  * #导入numpy函数库
import  operator#导入操作符

#创建数据集
def createDateSet():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B']
return group,labels

#算法核心
#inX:用于分类的输入向量。即将对其进行分类。
# DataSet:训练样本集
#labels :标签向量
def classify0(inX,dataSet,labels,k):
#距离计算
dataSetSize=dataSet.shape[0] #得到数组的行数。即知道有几个训练数据
diffMat=tile(inX,(dataSetSize,1))-dataSet # tile:numpy中的函数。
# tile将原来的一个数组扩充成了4个一模一样的数组
# (tile有重复的功能,dataSetSize是重复4次,后面的1保证重复完了4行,而不是一样里面有四个一样的)
# 。diffMat得到了目标与训练数值之间的差值。
sqDiffMat=diffMat**2#得到的diffMat,平方
sqDiffMatDistances=sqDiffMat.sum(axis=1)#axis=1是列相加,即(x1-x2)^2+(y1-y2)^2
distances =sqDiffMatDistances**0.5#开方,得到的是距离
sortedDistIndicies=distances.argsort()#argsort() 是排序,将元素按照升序排列,返回的是升序过后的下标
#如:[5,7,3],返回的是[2,0,1],其中2,0,1分别代表3,5,7
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]#取离样本集最近的样本,存放在voteIlabel中,也就是样本字典
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
#get是取字典里的元素,如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,如果没有就返回0(括号里面的0)
#这行代码的意思就是算距离目标距离最近的k个点ed类别,这个点是哪个类别那个类别就加一
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
# key=operator.itemgetter(1)的意思是按照字典里的第一个排序,{A:1,B:2},要按照第1个(AB是第0个),即‘1’‘2’排序。reverse=True是降序排序
#key=operator.itemgetter(1)的意思是按照字典里的第一个排序,即{A:2,,B:3}要按照第一个(A,B是元素的第0 个),也就是按照2,3排序。reverse=True是降序排序
return sortedClassCount[0][0]#返回最多的类别,即sortedClassCount[0]是A:2,sortedClassCount[0][0]是A


注: 如果出现


AttributeError: 'dict' object has no attribute 'iteritems'   原因是

Python3.5中:iteritems变为items,2.7中iteritems可以使用的

进入Python工作区间,也就是该文件存放的路径,进入cmd-->>运行python-->导入类 import Test_python-->> group,leabels=Test_python.createDateSet()--->> Test_python.classify0([0,0],group,leabels,3)
output:  'B'

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  KNN