一、K-近邻值算法,实现语言python
1、伪代码
对未知类别属性的数据集中的每个点依次执行以下操作
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。
2、程序如下
#!/usr/bin/pythonfrom 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"inX:用于分类的输入向量,dataSet:训练样本集,labels:标签向量,k最近邻居的数目"def classify0(inX,dataSet,labels,k):"这个是获取矩阵的第一维的长度""""获取矩阵的长度shape[0]获取第一维的长度"""dataSetSize = dataSet.shape[0]print(dataSetSize)"""tile(a,(2,1)) 将a按一维度重复1次,也就变成了矩阵"""diffMat = tile(inX,(dataSetSize,1)) - dataSetprint(diffMat)"""2次幂"""sqDiffMat = diffMat**2print(sqDiffMat)"""axis=1表示按行相加 , axis=0表示按列相加"""sqDistances = sqDiffMat.sum(axis=1)print(sqDistances)"开方"distances = sqDistances**0.5print(distances)"返回distances从小到大的索引值(不是返回现实值,这个索引值去labels中取)"sortedDistIndicies = distances.argsort()print(sortedDistIndicies)classCount = {}for i in range(k) :"""根据索引值获取距离最短的目标值"""voteIlabel = labels[sortedDistIndicies[i]]"""计算目标值出现的次数"""classCount[voteIlabel] = classCount.get(voteIlabel,0)+1print(classCount)"""倒序排序字典,更具目标值key=lambda x:x[1]:用第二个关键字来排序reverse=True:倒序排序"""sortedClassCount = sorted(classCount.items(), key=lambda x:x[1],reverse=True)print(sortedClassCount)"""返回概率最大的值"""return sortedClassCount[0][0]group,labels=createDataSet()result = classify0([0,0],group,labels,3)print(result)
3、注意事项
在python3中没有了字典的iteritems方法,需要导入numpy模块
