您的位置:首页 > 其它

用k-近邻算法:手写识别系统

2018-01-05 10:40 134 查看

用k-近邻算法:手写识别系统

一、准备数据:将图像转换为测试向量我们将图像格式化处理为一个向量:把一个32x32的二进制图像矩阵转换为1x1024的向量。还是在kNN.py文件中,编写将图像转换为向量的函数如下:
#将图像转换为测试向量
def img2vector(filename):
returnVect = zeros((1, 1024))#创建一个1x1024的numpy数组
fr = open(filename)#打开指定问价
for i in range(32):#循环读出文件的前32行
lineStr = fr.readline()#读取第i行,就一行
for j in range(32):#将每行的前32个字符值存储在numpy数组中
returnVect[0, 32*i+j]=int(lineStr[j])
return returnVect
在命令行中输入:
>>> import kNN
>>> testVector = kNN.img2vector('/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/testDigits/0_2.txt')
>>> testVector[0, 0:31
>>> testVector[0, 32:63]
二、测试算法:使用k-近邻算法识别手写算法
还是在kNN.py文件中,测试分类器代码如下:
# 手写数字识别系统的测试代码
def handwritingClassTest():
hwLabels = []  # 存储训练数据集的标签
# 获取训练数据文件中的内容
trainingFileList = listdir(
'/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/trainingDigits')
# 用listdir()返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序,将这些名字存放在一个列表中
m = len(trainingFileList)  # 训练集中包含的图片总数
trainingMat = zeros((m, 1024))  # 构造训练矩阵,该矩阵的每行数据存储一个图像

# 从文件名中解析出分类数字
for i in range(m):  # 遍历每个样本文件
fileNameStr = trainingFileList[i]  # 第i个文件的名字
fileStr = fileNameStr.split('.')[0]  # 以.为分割将名字分割为字符串数组
classNumStr = int(fileStr.split('_')[0])  # 实现了从文件名中解析分类数字
hwLabels.append(classNumStr)
trainingMat[i, :] = img2vector(
'/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/trainingDigits/%s' % fileNameStr)

testFileList = listdir('/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/testDigits ')
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(
'/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/testDigits/$s' % fileNameStr)
classifierResult = classify(vectorUnderTest, trainingMat, hwLabels, 3)

print("the classifier came back with: %d, the real anser is: %d" % (classifierResult, classNumStr))
if (classifierResult != classNumStr): errorCount += 1.0
print "\nthe total number of errors is: %d" % errorCount
print "\nthe total error rate is: %f" % (errorCount / float(mTest))
补充:os.listdir(): 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 '.' 和'..' 即使它在文件夹中。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息