1.算法描述
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
2.Python代码实现
kNN.py:
//注释:
# shape[0]获取行 shape[1] 获取列
#tile类似于matlab中的repmat,复制矩阵
# 获取类别
#字典的get方法,查找classCount中是否包含voteIlabel,是则返回该值,不是则返回defValue,这里是0# 其实这也就是计算K临近点中出现的类别的频率,以次数体现
# 对字典中的类别出现次数进行排序,classCount中存储的事 key-value,其中key就是label,value就是出现的次数# 所以key=operator.itemgetter(1)选中的事value,也就是对次数进行排序
#sortedClassCount[0][0]也就是排序后的次数最大的那个label
详解:
dataSet.shape[0]:表示训练集中向量的个数。
shape[n]:表示第n维的长度
例如:
>>>group.shape[0]
4
>>>group.shape[1]
2
tile(inX,(dataSetSize,1)):得到的是dataSetSize个的inX。
tile(A,reps):construct an array by repeating A the number of times given by reps.
具体用法可见:docs.scipy.org/doc/numpy/reference/generated/numpy.tile.html
sqDiffMat.sum(axis=1):得到的是第二维的所有元素之和。
具体用法可见:docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html
distances.argsort():是将distances里的元素从小到大排列,得到一个对应原来的元素的顺序排列。
具体用法可见:docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html
classCount.get(voteIlabel,0):返回字典中,voteIlabel的值,如果没有,则创建,并将值设为0(即第二个参数)。
sortedClassCount = sorted(classCount.items(),
key = operator.itemgetter(1),reverse = True)
将字典按照item的第一维逆向排序。
在Ubuntu系统终端中打开python,
>>> import kNN
>>> group,labels = kNN.createDataSet()
>>> 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'
>>> kNN.classify0([1.2,1.6],group,labels,3)
'A'
3:案例—约会网站
datingTestSet2.txt
下载链接:http://download.csdn.net/download/u012005313/9190017