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'