# -*- coding: UTF-8 -*-
import numpy as np
import operator
from os import listdir
from sklearn.neighbors import KNeighborsClassifier as kNN
"""
函数说明:将32x32的二进制图像转换为1x1024向量。
Parameters:
filename - 文件名
Returns:
returnVect - 返回二进制图像的1x1024向量
"""
def img2vector(filename):
#创建1x1024零向量,np.zeros((a,b)),a代表第一层括号(最外层)看向元素个数,b代表第二层括号内向量元素个数即内层
#注意这里zeros(1,1024)产生的是二维数组[[0,0,....]]
return_vect = np.zeros((1, 1024)) # 数组的索引都是从0开始,但是size/shape中都是实际数目。
#打开文件
fr = open(filename)
#按行读取
for i in range(32):
#读一行数据
lineStr = fr.readline()
#每一行的前32个元素依次添加到returnVect中
for j in range(32): #range(32):0,1,2,....31
return_vect[0,32*i+j] = int(lineStr[j]) #0:向量第一层内的第一个分向量
#返回转换后的1x1024向量
return return_vect
"""
函数说明:手写数字分类测试
"""
def handwriting_ClassTest():
#测试集的Labels
hwLabels = []
#返回trainingDigits目录下的文件名
trainingFileList = listdir('C:/Users/Administrator/Desktop/data/Ch02/digits/trainingDigits')
#返回文件夹下文件的个数
m = len(trainingFileList)
#初始化训练的Mat矩阵,测试集
trainingMat = np.zeros((m, 1024))
#从文件名中解析出训练集的类别
for i in range(m):
#获得文件的名字
fileName_Str = trainingFileList[i]
#获得分类的数字
classNumber = int(fileName_Str.split('_')[0])
#将获得的类别添加到hwLabels中
hwLabels.append(classNumber)
#将每一个文件的1x1024数据存储到trainingMat矩阵中
trainingMat[i,:] = img2vector('C:/Users/Administrator/Desktop/data/Ch02/digits/trainingDigits/%s' % (fileName_Str))
#构建kNN分类器
neigh = kNN(n_neighbors = 3, algorithm = 'auto')
#拟合模型, trainingMat为测试矩阵,hwLabels为对应的标签
neigh.fit(trainingMat, hwLabels)
#返回testDigits目录下的文件列表
testFileList = listdir('C:/Users/Administrator/Desktop/data/Ch02/digits/testDigits')
#错误检测计数
errorCount = 0.0
#测试数据的数量
mTest = len(testFileList)
#从文件中解析出测试集的类别并进行分类测试
for i in range(mTest):
#获得文件的名字
fileName_Str = testFileList[i]
#获得分类的数字
classNumber = int(fileName_Str.split('_')[0])
#获得测试集的1x1024向量,用于训练
vector_UnderTest = img2vector('C:/Users/Administrator/Desktop/data/Ch02/digits/testDigits/%s' % (fileName_Str))
#获得预测结果
# classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
classifierResult = neigh.predict(vector_UnderTest)
print("分类返回结果为%d\t真实结果为%d" % (classifierResult, classNumber))
if(classifierResult != classNumber):
errorCount += 1.0
print("总共错了%d个数据\n错误率为%f%%" % (errorCount, errorCount/mTest * 100))
"""
函数说明:main函数
"""
if __name__ == '__main__':
handwriting_ClassTest()
机器学习实战SKlearn之KNN手写数字识别
猜你喜欢
转载自blog.csdn.net/qq_42422981/article/details/84357052
今日推荐
周排行