手写识别系统(仅0-9)
此系统仅能识别0-9,需识别的数字已经使用图像处理软件处理成具有相同色彩和大小:32*32像素的黑白图像,将图像转换为了文本格式。
步骤:
1)收集数据:文本文件
2)准备数据:函数img2vector() 将图像格式转换为分类器使用的向量格式
3)分析数据:在python命令符中检查数据,确保它符合要求
4)训练算法:KNN中不适用
5)测试算法:编写函数使用提供的部分数据集作为测试样本,测试样本与非测试样本的区别在于测试样本是已经完成分类的数据,如预测分类与实际类别不同,则标记为一个错误
6)使用算法:文中没有完成。可从图像中提取数字,并完成数字识别。
KNN算法(和之前的一样)
函数:classify0()
一、准备数据、
训练数据:trainningDigits 每个数字大概200种
测试数据:testDigits 900个
1. 将图像格式化处理为一个向量
32×32 → 1×1024
创建1×1024的NumPy数组,然后打开给定的文件,循环读出文件的前32行,并将每行的头32个字符存储在NumPy数组中,最后返回数组
函数:img2vector
def img2vector(filename):
returnVect = zeros((1,1024)) # 构造1×1024的矩阵
fr = open(filename)
for i in range(32): # 每一行
lineStr = fr.readline()
for j in range(32): # 每行依次写入returnVect中
returnVect[0,32*i+j] = int(lineStr[j])
return returnVect
二、测试算法
函数:hwClassTest
不用归一化 所以直接从准备数据→(分析数据→)测试数据
def hwClassTest():
hwLables = []
trainingFileList = os.listdir('trainingDigits') # 制定训练文件夹
m = len(trainingFileList)
trainingMat = zeros([m,1024])
for i in range(m): # 对每一个文件
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileNameStr.split('_')[0]) # 从文件名解析分类数字
hwLables.append(classNumStr)
trainingMat[i,:] = img2vector('./trainingDigits/%s'%fileNameStr)
testFileList = os.listdir('testDigits')
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileNameStr.split('_')[0]) # 从文件名解析分类数字
vectorUnderTest = img2vector('testDigits/%s'%fileNameStr)
classifierResult = classify0(vectorUnderTest,trainingMat,hwLables,3)
print("the classifer came back with:%d, the real answer is:%d" % (classifierResult,classNumStr))
if(classifierResult != classNumStr):
errorCount += 1
print("\nthe total number of errors is : %d" % errorCount)
print("\nthe total error rate is : %f" % (errorCount/float(mTest)))
算法的执行效率并不高,存储空间和计算时间开销大。k决策树是k-近邻算法的优化版
knn必须保存全部数据集,如果训练数据集很大,要占用大量的存储空间。并且需要对数据集中的每个数据计算距离,实际使用可能十分耗时。
第一章总结 KNN
1. 核心算法KNN
①计算距离
②距离排序(小→大)
③取前k个 统计标签
④标签排序(大→小)
⑤返回标签最大的值
2. 数据处理函数
①将数据特征处理为向量
②处理标签列表
3. 归一化函数
①最大值
②最小值
③值-最小值/(最大值-最小值)
4. 测试函数
5. 使用函数
※输入的数据也需要进行归一化