k-近邻算法采用测量不同特征值之间的距离方法进行分类,属于监督学习。
主要代码如下:
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):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX,(dataSetSize,1)) - dataSet
sqDiffMat = diffMat **2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances **0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) +1
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
createDataSet()用于导入数据;
主要介绍classify0(inX,dataSet,labels,k):
- 4个输入参数:用于分类的输入向量inX,训练样本集dataSet(是一个数组),标签向量labels,用于选择最近邻的数目k;
dataSetSize = dataSet.shape[0] 这一句使用到了NumPy的shape函数,返回矩阵/数组的不同维数的长度,第一个元素(shape[0])表示第一维的长度,亦即行数,即有几个训练数据;
diffMat = tile(inX, (dataSetSize,1)) - dataSet 这里用到了NumPy中的tile(A,reps)函数,用于扩充A,numpy.tile([0,0],(3,1))表示将(0,0)在行上重复3次,在列上重复1次;
sqDiffMat = diffMat**2 求平方;
sqDistances = sqDiffMat.sum(axis=1) 在列上求和;
distances = sqDistances**0.5 求开方,上面的几步是用来计算距离的;
sortedDistIndicies = distances.argsort()使用了argsort()函数,升序排序,返回数组值从小到大的索引index;
classCount={} 这是一个dict,用于存储不同标签出现的次数;
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
这里是选择距离最小的k个点, sortedDistIndicies已经排好序,只需迭代的取前k个样本点的labels(即标签),并计算该标签出现的次数,这里还用到了dict.get(key, default=None)函数,key就是dict中的键voteIlabel,如果不存在则返回一个0并存入dict,如果存在则读取当前值并+1;
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) 这里使用了sorted()函数sorted(iterable, cmp=None, key=None, reverse=False),iteritems()将dict分解为元组列表,operator.itemgetter(1)表示按照第二个元素的次序对元组进行排序,排序默认是升序,reverse=true表示反转,降序排序