1 手写字的识别 (KNN)
通过0,1二值化把手写数字,变化成矩阵
32*32
1.1 读取训练集
import numpy as np
from os import listdir # 读取文件夹下的所有文件,形成一个文件列表
# 图片转矩阵
def img2vector(filename):
returnVect = np.zeros((1,1024)) # 每个图片矩阵32*32,存为1行
fr = open(filename)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0,32*i+j] = int(lineStr[j])
return returnVect
#读取数据
hwLabels = []
trainingFileList = listdir('E:\\Progarm\\Py_Program\\HandwritingRecognition\\trainingDigits')
m = len(trainingFileList)
trainingMat = np.zeros((m,1024))
for i in range(m):
fileNameStr=trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
hwLabels.append(classNumStr)
trainingMat[i,:] = img2vector('E:\\Progarm\\Py_Program\\HandwritingRecognition\\trainingDigits\\%s' % fileNameStr)
print(trainingFileList)
print(hwLabels)
print(trainingMat)
1.2 读取测试集
# 读取测试集,执行KNN分类
testFileList = listdir('E:\\Progarm\\Py_Program\\HandwritingRecognition\\testDigits')
k = 3
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('E:\\Progarm\\Py_Program\\HandwritingRecognition\\testDigits\\%s' % fileNameStr)
classifierResult = K.knn(vectorUnderTest,trainingMat,hwLabels,k)
print('KNN识别的结果是: %d , 实际是: %d' % (classifierResult,classNumStr))
if classifierResult != classNumStr:
errorCount +=1.0
print('训练集数量: %d ,测试集数量: %d' % (m,mTest))
print('错误识别数 : %d , 正确率 : %f ' % (errorCount , (1-errorCount/float(mTest))*100))
1.3 完整程序
import numpy as np
from os import listdir # 读取文件夹下的所有文件
import knn as K
# 图片转矩阵
def img2vector(filename):
returnVect = np.zeros((1,1024)) # 每个图片矩阵32*32,存为1行
fr = open(filename)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0,32*i+j] = int(lineStr[j])
return returnVect
#读取训练集数据
hwLabels = []
trainingFileList = listdir('E:\\Progarm\\Py_Program\\HandwritingRecognition\\trainingDigits')
m = len(trainingFileList)
trainingMat = np.zeros((m,1024))
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
hwLabels.append(classNumStr)
trainingMat[i,:] = img2vector('E:\\Progarm\\Py_Program\\HandwritingRecognition\\trainingDigits\\%s' % fileNameStr)
#print(trainingFileList)
#print(hwLabels)
#print(trainingMat)
# 读取测试集,执行KNN分类
testFileList = listdir('E:\\Progarm\\Py_Program\\HandwritingRecognition\\testDigits')
k = 3
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('E:\\Progarm\\Py_Program\\HandwritingRecognition\\testDigits\\%s' % fileNameStr)
classifierResult = K.knn(vectorUnderTest,trainingMat,hwLabels,k)
print('KNN识别的结果是: %d , 实际是: %d' % (classifierResult,classNumStr))
if classifierResult != classNumStr:
errorCount +=1.0
print('训练集数量: %d ,测试集数量: %d' % (m,mTest))
print('错误识别数 : %d , 正确率 : %f ' % (errorCount , (1-errorCount/float(mTest))*100))