from numpy import *
import operator
import os
def classify0(inX, dataSet, labels, k): # 构造分类器 KNN原理
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() # 这里是脚标的排列顺序如:[2 3 1 0]
classCount = {}
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 img2vector(filename): # 把32*32的矩阵转化成1*1024的向量
returnVector = zeros((1, 1024))
fr = open(filename)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVector[0, 32 * i + j] = int(lineStr[j])
return returnVector
def handwritingClassTest():
hwLabels = []
trainingFileList = os.listdir("./trainingDigits/")
m = len(trainingFileList)
trainingMat = 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('./trainingDigits/%s' %(fileNameStr))
testFileList=os.listdir('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('./testDigits/%s' %(fileNameStr))
classifyResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
# print("识别结果是%d,真实结果是%d" %(classifyResult,classNumStr))
if (classifyResult!=classNumStr):
errorCount +=1
print("识别结果是%d,真实结果是%d" %(classifyResult,classNumStr))
print("错误数为%d" %(errorCount))
print("错误率是%f" %(errorCount/mTest))
def main():
handwritingClassTest()
if __name__ == '__main__':
main()