机器学习实战Ch02: k-近邻算法

k-近邻算法算是一个非常暴力也非常好理解的算法

(抽象来讲,就是和谁长得像就分为哪一类

如何划分长得像还是不像的尺度? 把特征值当做坐标,把个体当做线性空间中的离散点,取k个离目标最近的训练集点,进行label vote,少数服从多数。

That's it.

至于什么是label vote...完全是自己yy的名词,就是取出现次数最多的label而已啦

当训练集的数据足够多,k取得足够大的时候,其实是不用担心次数出现相同的情况的

另外要注意对数据量度的“标准化”处理,此处对应下文autoNorm部分

 

好的下面来讲一讲实现的问题

createDataSet()

#用于创建样例训练集

#返回dataSet, labels

 

file2matrix(filename)

#用于将txt中的文件前几列读入returnMat,最后一列读入returnLabelVector

#注意这里的returnMat实际上是array,并没有必要用到matrix

#返回returnMat, returnLabelVector

 

img2vertor(filename)

#和file2matrix差不多

#返回returnVec(label在文件名里,另外处理)

 

classify0(inX, dataSet, labels, k)

#分类器,计算出inX与dataSet中所有欧几里得距离并排序

#返回normMat, ranges, minVals

'''

这里计算与各点距离利用到array可以直接相减等性质,并不需要另外迭代(循环)

vote的结果用dict记录

并且注意一下dict的排序写法

'''

 

autoNorm(dataSet)

#标准化器,标准化公式 newVal = (Val - minVal)/(maxVal-minVal)

#同样用到了array整体操作的技巧,以及tile函数

#返回normDataSet, ranges, minVals

 

handwritingClassTest()

#数字分类测试器,利用img2vector将trainingDigits中的图像压缩成向量,并逐个整理进数据集,再用classify0分类器对testDigits中的经处理后的向量逐个进行分类,并统计分类正确率

 

datingClassTest()

#一个和handwritingClassTest原理差不多的东西,只是按比例把一个数据集划分(注意这里的划分和之后提到的“划分”完全两回事)成两个部分,分别作为训练集和待判断数据,相当于一个自我测试

 

plotmatlib这玩意儿太诡异了,迟点再补充,本书作者好像默认读者对plotmatlib库函数很熟悉啊?

posted @ 2017-02-14 17:26  K.Nick  阅读(261)  评论(0编辑  收藏  举报
$a = (1-\sin(\theta))$