前面兩個(gè)小節(jié)都給出了完整的代碼,這部分我只打算貼出自定義的函數(shù):
#手寫(xiě)體識(shí)別菊卷,將圖像轉(zhuǎn)換為向量格式
#將數(shù)據(jù)處理成分類(lèi)器可以識(shí)別的格式
def img2vector(filename):
returnVect = zeros((1,1024))#定義一個(gè)空矩陣;1024=32*32
? ? fr =open(filename)
for iin range(32):#將每行的頭32個(gè)字符存在數(shù)組中
? ? ? ? lineStr = fr.readline()
for jin range(32):#將每列的頭32個(gè)字符存在數(shù)組中
? ? ? ? ? ? returnVect[0,32*i+j] =int(lineStr[j])
return returnVect
def handwritingClassTest():
hwLabels = []
trainingFileList = listdir('trainingDigits')
m =len(trainingFileList)
trainingMat = zeros((m,1024))#創(chuàng)建m行1024列訓(xùn)練矩陣,每行數(shù)據(jù)存儲(chǔ)一個(gè)圖像
? ? for iin range(m):
fileNameStr = trainingFileList[i]#獲取標(biāo)簽洁闰,也就是獲取這個(gè)數(shù)字是幾
? ? ? ? fileStr = fileNameStr.split('.')[0]
#對(duì)文件名進(jìn)行分割歉甚。就是2_45.txt扑眉,從.那個(gè)地方開(kāi)始分割文件名纸泄,就得到2_45和txt兩部分腰素,我是這么理解的
? ? ? ? #split()[0]? split()里面是空的時(shí)候聘裁,默認(rèn)刪除空白符耸弄,[0]表示取分割后數(shù)組的第一個(gè)元素
? ? ? ? classNumStr =int ((fileStr.split('_'))[0])
hwLabels.append(classNumStr)
trainingMat[i,:] = img2vector('trainingDigits/%s'%fileNameStr)
testFileList = listdir('testDigits')
errorCount =0.0? ? ? ? #初始化錯(cuò)誤率
? ? mTest =len(testFileList)
for iin range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
#對(duì)文件名進(jìn)行分割。就是2_45.txt计呈,從.那個(gè)地方開(kāi)始分割文件名砰诵,就得到2_45和txt兩部分捌显,我是這么理解的
? ? ? ? #split()[0]? split()里面是空的時(shí)候茁彭,默認(rèn)刪除空白符扶歪,[0]表示取分割后數(shù)組的第一個(gè)元素
? ? ? ? classNumStr =int (fileStr.split('_')[0])
vectorUnderTest = img2vector('trainingDigits/%s'%fileNameStr)
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 "the total number of error is %d" % errorCount
print "the total error rate is %s" %float(errorCount/float(mTest))
if __name__ =="__main__":
#datingClassTest()
#classifyperson()
? ? handwritingClassTest()
K近鄰算法:
1)必須保存全部數(shù)據(jù)集理肺,如果訓(xùn)練數(shù)據(jù)集很大,必須使用大量的存儲(chǔ)空間
2)要計(jì)算每個(gè)數(shù)據(jù)集的距離值妹萨,非常耗時(shí)
3)無(wú)法給出任何數(shù)據(jù)的基礎(chǔ)結(jié)構(gòu)信息,我們無(wú)法知曉平均實(shí)例和典型實(shí)例樣本具體是什么特征
上述代碼出現(xiàn)了一個(gè)問(wèn)題乎完,誤差相當(dāng)大熏兄,高達(dá)了71%,代碼運(yùn)行正常树姨,可能別的地方出了問(wèn)題摩桶,歡迎交流~