过程
-
收集数据: 提供⽂本⽂件。
-
准备数据: 编写函数classify0(), 将图像格式转换为分类器使
⽤的list格式。 -
分析数据: 在Python命令提⽰符中检查数据, 确保它符合要求。
-
训练算法: 此步骤不适⽤于k近邻算法。
-
测试算法: 编写函数使⽤提供的部分数据集作为测试样本, 测试样
本与⾮测试样本的区别在于测试样本是已经完成分类的数据, 如果
预测分类与实际类别不同, 则标记为⼀个错误。 -
使⽤算法: 本例没有完成此步骤, 若你感兴趣可以构建完整的应⽤
程序, 从图像中提取数字, 并完成数字识别, 美国的邮件分拣系统
就是⼀个实际运⾏的类似系统。
为了使⽤前⾯两个例⼦的分类器, 我们必须将图像格式化处理为⼀个向量。 我们将把⼀个32x32的⼆进制图像矩阵转换为1x1024的向量, 这样前两节使⽤的分类器就可以处理数字图像信息了。
完整代码实现
from numpy import *
from os import listdir
import operator
# 将图像转换成向量
def img2vector(filename):
returnVect = zeros((1,1024))
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
# 测试img2vector
# testVector = img2vector('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/testDigits/0_13.txt')
# print(testVector[0,0:31])
#数据分析 KNN
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
#❶(以下三⾏) 距离计算
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
classCount={}
#❷ (以下两⾏) 选择距离最⼩的k个点
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(),
#❸ 排序
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
# ⼿写数字识别系统的测试代码
def handwritingClassTest():
hwLabels = []
# 这段代码的主要功能是从os模块中导⼊函数listdir, 它可以列出给定⽬录的⽂件名
trainingFileList = listdir('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/trainingDigits') #load the training set
# m=1934 共1934个文件
m = len(trainingFileList)
trainingMat = zeros((m,1024))
for i in range(m):
# (以下三⾏) 从⽂件名解析分类数字
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0] #take off .txt
classNumStr = int(fileStr.split('_')[0])
# 文件9_45.txt的分类是9,它是数字9的第45个实例
hwLabels.append(classNumStr)
trainingMat[i,:] = img2vector('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/trainingDigits/%s' % fileNameStr)
# 用测试集去测试准确度
testFileList = listdir('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/testDigits') #iterate through the test set
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0] #take off .txt
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/testDigits/%s' % fileNameStr)
# KNN算法测验
classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
print ("the classifier came back with: %d, the real answer 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)))
handwritingClassTest()
网友评论