一、定义
KNN可以看成,有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑离这个训练数据最近的K个点看看这几个点属于什么类型,然后用少数服从多数的原则,给新数据归类,如下图所示:如果K=3,那么离绿色点最近的有2个红色的三角形和1个蓝色的正方形,这三个点进行投票,于是绿色的待分类点就属于红色的三角形。而如果K=5,那么离绿色点最近的有2个红色的三角形和3个蓝色的正方形,这五个点进行投票,于是绿色的待分类点就属于蓝色的正方形。
图一、KNN算法小示例
从上面的例子可以抽象出KNN算法的流程图如下图所示
图二、KNN算法流程图
定义既可以表述为:K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
二、KNN算法的伪代码
Algorithm KNN(A[n], k) { Input: A[n]为N个训练样本的分类特征; k为近邻个数;
Initialize: 选择A[1]至A[k]作为x的初始近邻; 计算初始近邻与测试样本x间的欧氏距离d(x, A[i]), i=1,2,...k; 按d(x, A[i])从小到大排序; 计算最远样本与x间的距离D,即max{d(x, A[j]) | j=1,2...k};
for(i=k+1; i<n+1; i++) 计算A[i]与x间的距离d(x, A[i]);
if (d(x, A[i]) < D ) then 用A[i]代替最远样本; 按照d(x, A[i])从小到大排序; 计算最远样本与x间的距离D,即max{d(x, A[j]) | j=1,...i}; 计算前k个样本A[i]所属类别的概率,i=1,2,...k; 具有最大概率的类别即为样本x的类; end for
Output: x所属的类别。 } |
三、公式描述
四、python代码编制
#coding=utf-8
from numpy import *
import operator
def createDataSet():
group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])
labels = ['A','A','B','B']
return group,labels
#inputX表示输入向量(也就是我们要判断它属于哪一类的)
#dataSet表示训练样本
#label表示训练样本的标签
#k是最近邻的参数,选最近k个
def kNNclassify(inputX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]#计算有几个训练数据
#开始计算欧几里得距离
diffMat = tile(inputX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)#矩阵每一行向量相加
distances = sqDistances ** 0.5
#欧几里得距离计算完毕
sortedDistance = distances.argsort()
classCount = {}
for i in xrange(k):
voteLabel = labels[sortedDistance[i]]
classCount[voteLabel] = classCount.get(voteLabel,0) + 1
res = max(classCount)
return res
def main():
group,labels = createDataSet()
t = kNNclassify([1.0,1.0],group,labels,3)
print t
if __name__=='__main__':
main()
结果集 t = kNNclassify([1.0,1.0],group,labels,3) 对应的结果为
结果集t=kNNclassify([1.0,1.0],group,labels,2) 对应的结果为
参考资料: