机器学习实战笔记(1)-K近邻算法

时间:2023-02-03 21:25:16


配套书:Peter Harrington 著 李锐 * 曲亚东翻译 工信出版社

本次学习采取直接配套《机器学习实战笔记》,遇到什么数学和python问题,就单独的去反查,争取从实战中领悟。

本章的算法其实很简单,就是计算向量之间的距离。 对于一个测试数据,计算它和已知的N个已经分类的向量的距离。

然后对距离排序,选择出来最短的K个距离。那么K个距离对应K个已知的向量分类,哪个比例占据的多,就属于哪个分类。

很朴素又很巧妙的算法。直观好理解。这个算法其实无训练过程,标准数据需要人工先做好分类。


遇到的问题:


  1. python的数组和矩阵的表达很迷惑,总是心里来回换算。 别的编程语言二维数组就是 a[3,3]= (a0,0, a0,1, a0,2)


a[3,3]= (a0,0, a0,1, a0,2)

(a1,0, a1,1, a1,2)

(a2,0, a2,1, a2,2)

怎么python的数组表达挺难理解的?


  1. python的的矩阵计算和表达,向量距离计算,这个提供了一个通用的函数。



def classify0(inX, dataSet, labels, k): 输入测试向量和训练集,还有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() 对distance排序,这里对list loop array要特别熟悉。

排序后,一个列是距离,一个列是对应的分类。

classCount={} 这里开始计算哪个分类在K个中存在的比例最高

for i in range(k):

voteIlabel = labels[sortedDistIndicies[i]]

classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1

sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

return sortedClassCount[0][0] 返回比例最多的分类,就是计算结果了!


此外,还得熟悉对数据的预格式化,比如:必须变为输入向量,格式变换的等。这写其实都和机器学习无关了。就是普通的

简单编程了。


针对数字识别的例子,我多次调整K值,发现3是最合适的。k=15-20, 误差率很高。当然这个和样本的数量有关。


本章就是树立最基本的机器学习算法的概念,熟悉基本的python编程和数据的预处理。


学习的时候总是转不过来弯。为何这么做?用if then else不就可以分类的更简单么?


最后手写体识别的例子很实用,大约错误率在0.2左右。让大家立刻感觉机器学习的实用性了。我反复调整了K数值,从1-20都尝试,发现还是k=3最合理(也许和样本数量有关系)

简单直观的处理二进制数据!


00000011110000000000000111000000

00000011110000000000000111000000

00000011110000000000000111000000

00000011110000000000000111000000

00000011110000000000001111000000

00000011110000000000001111000000

00000011110000000000011111000000

00000001110000000000111110000000

00000001111000000001111110000000

00000000111111000111111110000000

00000000111111111111111110000000

00000000111111111111111100000000

00000000011111111111111100000000

00000000011111111111111000000000

00000000001111111111110000000000