k-近邻算法采用测量不同特征值之间的距离进行分类。
工作原理:
存在一个样本数据集合,也称作训练样本集,并且每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。
输入没有标签的新数据的时候,将新数据的每个数据与样本集的每个数据对应的特征进行对比,然后提取其中特征最相似的的分类标签。
伪代码:
对未知的类别属性的数据集中的每个点依次执行以下操作:
计算已知数据集点与当前点之间的距离;
按照距离升序排序;
选取距离最小的前k个点;
确定前k个点所在类别的频率;
返回我们当前将要预测的点对应的频率最高的分类;
接下来我们将我们的想法封装为对应的函数就好了。
<学习笔记> k-近邻算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def classify0(intx,dataset,labels,k):
#此函数输入四个参数,待分变量,训练集,标签集,k值;
datasetsize=dataset.shape[0]
diffmat=tile(intx,(datasetsize,1))-dataset;
#对intx进行元素的复制,在列方向上为datasetsize次,行为1次;
#将复制后的元素与dataset做差;
sqdiffmat=diffmat**2
sqdistances=sqdiffmat.sum(axis=1)
distances=sqdistances**0.5
#求距离嘛。。
sorteddistaindicies=distances.argsort()
#排序;
classCount={}
for i in range(k):
voteIlabel=labels[sorteddistaindicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount=sorted(classCount.iteritems(),
key=operator.itemgetter(1),
reverse=True)
return sortedClassCount