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库函数很熟悉啊?