KNN近隣アルゴリズム(python 3)手書き数字の識別
2751 ワード
import numpy as np
import operator
from os import listdir
def img2vector(filename):
returnVect=np.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
def classify0(inX, dataSet, labels, k):
#
dataSetSize = dataSet.shape[0]
# ,
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
# sqDistances
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
# ,
distances = sqDistances**0.5
#
sortedDistIndicies = distances.argsort()
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 handwritingClassTest():
#
hwLabels = []
#
trainingFileList = listdir(r'F:\learning\lab3_0930\digits\trainingDigits')
m = len(trainingFileList)
# (M*1024)
trainingMat = np.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(r'F:\learning\lab3_0930\digits\trainingDigits\%s' % fileNameStr)
#
testFileList = listdir(r'F:\learning\lab3_0930\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(r'F:\learning\lab3_0930\digits\testDigits\%s' % fileNameStr)
#
classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
# KNN
print ("the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr))
# KNN
if (classifierResult != classNumStr): errorCount += 1.0
#
print ("
the total number of errors is: %d" % errorCount)
print ("
the total error rate is: %f" % (errorCount/float(mTest)))
handwritingClassTest()