数字化的32*32的二进制图像矩阵、图像格式及命名方式:

image.pngimage.png


img2vector函数

将数字化的手写数字图片(3232)转化为一维向量(11024)。
_# 将图像格式化处理为一个向量<br />_def img2vector(filename):<br /> print("filename = ",filename)<br /> returnVect = np.zeros((1,1024)) _#将32 X 32的图像转成1 X 1024 的一维向量<br /> _fr = open(filename)<br /> for i in range(32):<br /> lineStr = fr.readline() _#取第i行<br /> _for j in range(32):<br /> _# 用第i行第j个数据对returnVect[]的第32*i+j的位置上的数据进行替换<br /> _returnVect[0,32*i+j] = int(lineStr[i])<br /> return returnVect _#返回处理后的向量矩阵,每个图像为一行(1 * 1024)_


手写数字识别系统

_# 手写数字识别系统<br />_def handwritingClassTest():<br /> hwLabels = [] _#存放训练数据的类别<br /> _trainingFileList = listdir("trainingDigits") _#以列表形式获取文件目录(训练集)<br /> _m = len(trainingFileList)<br /> trainingMat = np.zeros((m,1024)) _#每行都是一个手写图片转成的一维向量<br /> # 对训练数据集进行处理<br /> _for i in range(m):<br /> fileNameStr = trainingFileList[i] _#获取第i个文件的文件名<br /> _fileStr = fileNameStr.split(".")[0]<br /> classNumStr = int(fileStr.split("_")[0]) _#提取数字标签<br /> _hwLabels.append(classNumStr)<br /> trainingMat[i,:] = img2vector("trainingDigits/%s"%fileNameStr) _#转化为一维向量<br /> _testFileList = listdir('testDigits') _#测试集<br /> _errorCount = 0.0 _#初始化错误率<br /> _mTest = len(testFileList) _#测试集数量<br /> # 对测试数据集进行处理<br /> _for i in range(mTest):<br /> fileNameStr = testFileList[i]<br /> fileStr = fileNameStr.split(".")[0]<br /> classNumStr = int(fileStr.split("_")[0])<br /> vectorUnderTest = img2vector("testDigits/%s"%fileNameStr)<br /> _# 调用KNN.py中的classify0()函数测试数据进行预测<br /> _classifierResult = knn.classify0(vectorUnderTest,trainingMat,hwLabels,k=5)<br /> print("预测的数字为:",classifierResult,"真实的数字为:",classNumStr)<br /> if(classifierResult != classNumStr):<br /> errorCount += 1<br /> print("预测错误的个数为:",errorCount)<br /> print("错误率:",errorCount / float(mTest))


预测结果:

训练数据集为 1934 个训练样本,测试数据集为 946 个测试样本。K值 = 5时的训练结果:

image.png

同样的数据集下,K值 = 7时的训练结果:

image.png

同样的数据集下,K值 = 3时的训练结果:

image.png
k的取值在一定程度上对整个系统的判断正确率起着至关重要的作用。