最近开始入门机器学习,使用的是图灵程序设计丛书《机器学习实战》。
k-邻近算法 即是KNN算法,是用来做归类的,也就是说,有一个样本空间里的样本分成很几个类型,然后,给定一个待分类的数据,通过计算接近自己最近的K个样本来判断这个待分类数据属于哪个分类。你可以简单的理解为由那离自己最近的K个点来投票决定待分类数据归为哪一类。计算最近k样本的指标是距离,用的是欧式距离公式;
在欧几里得空间中,点x =(x1,...,xn)和 y =(y1,...,yn)之间的欧氏距离为
然后对求得距离进行升序排序,选择k个最小的距离(通常k是小于20),观察这k个最小距离的样本是在什么类型里面的,如果大部分的样本都是属于同一个类型,那么我们就有把握推测这个测试的样本是属于这个类型的。
下面是最简单的一个实现:
from numpy import *
import operator
def createDataSet():
group = array([[0,0],[100,0],[100,100],[0,100]])
labels = ['A', 'B', ' C', 'D']
return group, labels
def 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()