KNN分类算法,KNN能够採用Euclidean(欧几里得)、Manhattan(曼哈顿)、Mahalanobis(马氏距离)等距离用于计算。
此次代码用欧几里得求距离。
testdata是测试数据集,traindata是训练数据集,labels是类别集。
要提前知道的:
1、数据框DataFrame.shape(),得到的是该数据框的行列数
2、numpy.tile函数:
eg:a=array([1,5,6,4])
tile(a,2)
结果:
array([1, 5, 6, 4, 1, 5, 6, 4])
说明是在列上扩展,第二个参数是a的重复次数
tile(a,(2,1))
array([[1, 5, 6, 4],[1, 5, 6, 4]])
行上扩展,元组的一个参数是控制行数的重复,第二个是控制列数的重复次数
3、operator.itemgetter:用于获取对象的哪维的数据,另外,该函数不直接得到值,而是定义了一个函数,通过函数作用到对应的对象上才能得到值。
4、说numpy.argsort()和sorted()区别:numpy下argsort()结果是一个对调用该方法的数组进行升序后的索引值数组,原数组值不变,针对的是array
sorted()是内置函数,针对的是List或dict
from numpy import *
import operator#knn分类算法
def knn(k,testdata,traindata,labels):
#testdata和traindata维数不同时,将testdata扩展为traindata同样的维数
#取出traindata行数
traindatasize=traindata.shape[0]
#将testdata在列方向上重复1次,行traindatasize次
#求testdata和traindata差值
dif=tile(testdata,(traindatasize,1))-traindata
sqdif=dif**2
#sum(axis=1)按行相加
sumsqdif=sqdif.sum(axis=1)
distance=sumsqdif**0.5
#距离升序排序
sortdistance=distance.argsort()
count={}
#选出距离最近的K个点的类别,统计是当前类别的次数
for i in range(0,k):
vote=labels[sortdistance[i]]
count[vote]=count.get(vote,0)+1
sortcount=sorted(count.items(),key=operator.itemgetter(1),reverse=True)
return sortcount[0][0]