[机器学习]k-邻近算法

来源:互联网 发布:论文数据造假会被发现 编辑:程序博客网 时间:2024/04/25 15:58

最近开始入门机器学习,使用的是图灵程序设计丛书《机器学习实战》。

k-邻近算法 即是KNN算法,是用来做归类的,也就是说,有一个样本空间里的样本分成很几个类型,然后,给定一个待分类的数据,通过计算接近自己最近的K个样本来判断这个待分类数据属于哪个分类。你可以简单的理解为由那离自己最近的K个点来投票决定待分类数据归为哪一类。计算最近k样本的指标是距离,用的是欧式距离公式;

欧几里得空间中,点x =(x1,...,xn)和 y =(y1,...,yn)之间的欧氏距离为

d(x,y):={\sqrt  {(x_{1}-y_{1})^{2}+(x_{2}-y_{2})^{2}+\cdots +(x_{n}-y_{n})^{2}}}={\sqrt  {\sum _{{i=1}}^{n}(x_{i}-y_{i})^{2}}}

然后对求得距离进行升序排序,选择k个最小的距离(通常k是小于20),观察这k个最小距离的样本是在什么类型里面的,如果大部分的样本都是属于同一个类型,那么我们就有把握推测这个测试的样本是属于这个类型的。

下面是最简单的一个实现:

from numpy import *import operatordef createDataSet():    group = array([[0,0],[100,0],[100,100],[0,100]])    labels = ['A', 'B', ' C', 'D']    return group, labelsdef classify(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.items(),key=operator.itemgetter(1),reverse=True)    return sortedClassCount[0][0]def main():    dataSet, labels = createDataSet()    print(classify([90, 0.9], dataSet, labels, 1))if __name__ == '__main__':    main()
得出的结果是B,其实这就是在一个平面里面随机设置一个点,观察这个点距离哪一个顶点最接近就属于哪一类,然而维度是可以增加的。

你可能疑惑numpy.tile()这个函数什么意思。

>>> import numpy  >>> numpy.tile([1,0],5)#在列方向上重复[0,0]5次,默认行1次  array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0])  >>> numpy.tile([2,2],(1,1))#在列方向上重复[0,0]1次,行1次  array([[2, 2]])  >>> numpy.tile([3,4],(3,1))  array([[3, 4],         [3, 4],         [3, 4]])  >>> numpy.tile([0,0],(1,3))#在列方向上重复[0,0]3次,行1次  array([[0, 0, 0, 0, 0, 0]])  

对于sum函数里的(axis=1)

加入axis=1以后就是将一个矩阵的每一行向量相加


例如:

import numpy as np

np.sum([[0,1,2],[2,1,3],axis=1)的结果就是:array([3,6])

另外还有一个提醒:

use dict.items() instead of dict.iteritems()

iteritems() was removed in python3, so you can't use this method anymore.

也就是说dict.items() 代替了 dict.iteritems()



0 0