k-近邻算法
在命令行按顺序导入
>>> import kNN
>>> group,labels = kNN.createDataSet()
>>> group
SyntaxError: unexpected indent
>>> group
array([[1. , 1.1],
[1. , 1. ],
[0. , 0. ],
[0. , 0.1]])
>>> labels
['A', 'A', 'B', 'B']
>>> kNN.classify0([0,0],group,labels,3)
'B'
>>>
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
def classify0(inX,dataSet,labels,k):#inX用于分类的输入向量;dataSet为输入的训练样本集;labels为标签向量;k用于选择最近邻居的数目
dataSetSize = dataSet.shape[0]#获得dataSet的行数
diffMat = tile(inX,(dataSetSize,1) - dataSet)#对应的差值
sqDiffMat = diffMat**2#差的平方
sqDistance = sqDiffMat.sum(axis=1)#差的平方的和
distance = sqDistance ** 0.5#差的平方的和的平方根
sortedDistIndicies = distance.argsort()#排序后,统计前面K个数据的分类情况
classCount = {}#字典
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]#labels得是字典才可以如此
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=Ture)#再次排序
return sortedClassCount[0][0]
使用欧式距离公式,(0,0)与3个样本的距离,与B最近得出结果
sorted接受三个参数,返回一个排序之后的list。
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=Ture)
sorted函数,针对的对象是list内的元素!不是整个list,所以,在key=函数这个应用时,是直接作用于元素对象上,并非list上!!!
第一个接受一个可迭代的对象(因为sorted实现了迭代协议,所以接受的参数不一定需要list,可以迭代的对象就可以,也是duck typing),返回一个排序之后的列表。
第二个接受一个布尔值,选择是否反转排序结果。
第三个接受一个回调函数,这个回调函数只能有一个参数(如果有多个参数,请用偏函数),根据这个函数的返回值进行排序。