关于KNN算法源码的一些理解
遇到的问题:
1.编程过程需要清晰的思路,目前思路还挺混乱
基本流程:
1.收集数据:提供的文本
2.准备数据:如编写imgVector(),将图片格式转化为分类器所使用的格式,或者补好空缺的数据等,就是对数据进行处理
3.分析数据:检查数据是否可用
4.训练算法:这个算法暂时没有
5.测试数据:拿一部分出来作为测试数据,测试数据就是已经完成分类的数据,如果预测数据和实际所属的数据不同,那就标记为一个错误
6.使用算法:目前还没遇到,不知道怎么做。。。
主要的程序以及功能 :
1.createDataSet()
创建一个group和label
2.classify0()
传说中的KNN算法:
1.使用欧式公式计算数据之间的距离
2.确定前K个距离最小元素所在的主要分类
3.进行排序,逆序,从大到小排序
此函数有四个输入:
1.inX:用于分类的输入向量
2.dataSet:用于训练的样本集
3.labels:标签向量(标签向量的元素数目==dataSet的行数)
4.用于选择最近邻居的数目
3.file2matrix()
文本解析数据,转为numpy
伪程序:
打开;
一行一行读;
每一行的len();
创建一个新的函数 zeros(len(),3);
for函数循环:
line = line.strip();
用循环的方式每次都把前4个数据放入数据栏;
用负索引将最后一列放入标签栏;
返回标签栏和数据栏
4.autoNorm()
归一化处理数据
简而言之:newValue =( oldValue-min)/(max-min)
5.datingClassTest()
分类器处理
1.使用file2matrix()和autoNorm()读取数据并将其归一化
2.决定哪部分测试,哪部分训练
3.将这两部分用classfly()函数进行处理
手写识别系统:
import KNN
#from OS import listdir
def img2vector(filename):
returnVect = zeros((1,1024))
fr = open(filename)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0,32*1+j] = int(lineStr[j])
return returnVect
testVect = KNN.img2vector('testDigits/0_73.txt')
print(testVect)
def handWritingClassTest():
hwLabels = []
trainingFileList = listdir('trainingDigits')
m = len(trainingFileList)
trainingMat = zeros(m,1024)
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = fileStr.split('_')[0]
hwLabels.append(classNumStr)
trainingMat[i,:] = img2vector('trainingDigits/%s'% trainingFileList)
testFileList = listdir('testDigits')
errorCount = 0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('testDigits/%s'%fileNameStr)
classifyResult = classify0(vectorUnderTest,trainingMat,hwLabels,3)
print('the classifier came back with: %d,the real answer is %d'%(classifyResult,classNumStr))
if(classifyResult != classNumStr):errorCount+=1.0
print('总错误数为%d'%errorCount)
print('错误率为%d'%(errorCount/float(mTest)))
KNN.handwritingClassTest()