一、K-近邻值算法,实现语言python
1、伪代码
对未知类别属性的数据集中的每个点依次执行以下操作
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。
2、程序如下
#!/usr/bin/python
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
"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)) - dataSet
print(diffMat)
"""2次幂"""
sqDiffMat = diffMat**2
print(sqDiffMat)
"""
axis=1表示按行相加 , axis=0表示按列相加
"""
sqDistances = sqDiffMat.sum(axis=1)
print(sqDistances)
"开方"
distances = sqDistances**0.5
print(distances)
"返回distances从小到大的索引值(不是返回现实值,这个索引值去labels中取)"
sortedDistIndicies = distances.argsort()
print(sortedDistIndicies)
classCount = {}
for i in range(k) :
"""
根据索引值获取距离最短的目标值
"""
voteIlabel = labels[sortedDistIndicies[i]]
"""
计算目标值出现的次数
"""
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
print(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模块