K近邻算法理论不再多述,点到点距离使用的是欧式距离,即平时数学所学的那个数学公式:√(x₁-x₂)²+(y₁-y₂)² 。
代码如下:
import numpy as np
import operator
from os import listdir
#定义样本点和标签
def creatDataSet():
group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
def classfy(examplepoint, dataSet, labels, k):
# 1.计算欧式距离
dataSetSize = dataSet.shape[0]
diffMat = np.tile(examplepoint, (dataSetSize, 1)) - dataSet
sqdistances = (diffMat ** 2).sum(axis=1)
distances = sqdistances ** 0.5
# argsort() 是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。
# 例如:y=array([3,0,2,1,4,5]) 则,x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以y[5]=5。
disindex = distances.argsort()
# 2.选择最小的k个点
classCount = {}
for i in range(k):
temp = labels[disindex[i]]
# 第2个参数 key=operator.itemgetter(1) 这个参数的意思是先比较第几个元素
# 例如:a=[('b',2),('a',1),('c',0)] b=sorted(a,key=operator.itemgetter(1))
# 结果: b=[('c',0),('a',1),('b',2)] 可以看到排序是按照后边的0,1,2进行排序的,而不是a,b,c
classCount[temp] = classCount.get(temp, 0) + 1
sortedClaCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
#sortedClaCount为[('B', 2), ('A', 1)]
return sortedClaCount[0][0]
def test():
group, labels = creatDataSet()
#[0.1, 0.1]为测试点,3为给定的K,大多数经过交差验证而定
print classfy([0.1, 0.1], group, labels, 3)
if __name__ == '__main__':
test()
最后输出结果为“B”,意思是测试点归为B类。
(参考很多资料,代码如有雷同请告知)