配套书:Peter Harrington 著 李锐 * 曲亚东翻译 工信出版社
本次学习采取直接配套《机器学习实战笔记》,遇到什么数学和python问题,就单独的去反查,争取从实战中领悟。
本章的算法其实很简单,就是计算向量之间的距离。 对于一个测试数据,计算它和已知的N个已经分类的向量的距离。
然后对距离排序,选择出来最短的K个距离。那么K个距离对应K个已知的向量分类,哪个比例占据的多,就属于哪个分类。
很朴素又很巧妙的算法。直观好理解。这个算法其实无训练过程,标准数据需要人工先做好分类。
遇到的问题:
- 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的数组表达挺难理解的?
- 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