機(jī)器學(xué)習(xí)python實(shí)戰(zhàn)之手寫數(shù)字識(shí)別
看了上一篇內(nèi)容之后,相信對(duì)K近鄰算法有了一個(gè)清晰的認(rèn)識(shí),今天的內(nèi)容——手寫數(shù)字識(shí)別是對(duì)上一篇內(nèi)容的延續(xù),這里也是為了自己能更熟練的掌握k-NN算法。
我們有大約2000個(gè)訓(xùn)練樣本和1000個(gè)左右測(cè)試樣本,訓(xùn)練樣本所在的文件夾是trainingDigits,測(cè)試樣本所在的文件夾是testDigits。文本文件中是0~9的數(shù)字,但是是用二值圖表示出來的,如圖。我們要做的就是使用訓(xùn)練樣本訓(xùn)練模型,并用測(cè)試樣本來檢測(cè)模型的性能。

首先,我們需要將文本文件中的內(nèi)容轉(zhuǎn)化為向量,因?yàn)閳D片大小是32*32,所以我們可以將其轉(zhuǎn)化為1*1024的向量。具體代碼實(shí)現(xiàn)如下:
def img2vector(filename):
imgVec = zeros((1,1024))
file = open(filename)
for i in range(32):
lines = file.readline()
for j in range(32):
imgVec[0,32*i+j] = lines[j]
return imgVec
實(shí)現(xiàn)了圖片到向量的轉(zhuǎn)化之后,我們就可以對(duì)測(cè)試文件中的內(nèi)容進(jìn)行識(shí)別了。這里的識(shí)別我們可以使用上一篇中的自定義函數(shù)classify0,這個(gè)函數(shù)的第一個(gè)參數(shù)是測(cè)試向量,第二個(gè)參數(shù)是訓(xùn)練數(shù)據(jù)集,第三個(gè)參數(shù)是訓(xùn)練集的標(biāo)簽。所以,我們首先需要將訓(xùn)練數(shù)據(jù)集轉(zhuǎn)化為(1934*1024)的矩陣,1934這里是訓(xùn)練集的組數(shù)即trainingDigits目錄下的文件數(shù),其對(duì)應(yīng)的標(biāo)簽轉(zhuǎn)化為(1*1934)的向量。之后要編寫的代碼就是對(duì)測(cè)試數(shù)據(jù)集中的每個(gè)文本文件進(jìn)行識(shí)別,也就是需要將每個(gè)文件都轉(zhuǎn)化成一個(gè)(1*1024)的向量,再傳入classify0函數(shù)的第一個(gè)形參。整體代碼如下:
def handWriteNumClassTest():
NumLabels = []
TrainingDirfile = listdir(r'D:\ipython\num_recognize\trainingDigits')#文件目錄
L = len(TrainingDirfile) #該目錄中有多少文件
TrainMat = zeros((L,1024))
for i in range(L):
file_n = TrainingDirfile[i]
fileName = file_n.split('.')[0]
ClassName = int(file_n.split('_')[0])
NumLabels.append(ClassName)
TrainMat[i,:] = img2vector(r'D:\ipython\num_recognize\trainingDigits\%s'%file_n)
TestfileDir = listdir(r'D:\ipython\num_recognize\testDigits')
error_cnt = 0.0
M = len(TestfileDir)
for j in range(M):
Testfile = TestfileDir[j]
TestfileName = Testfile.split('.')[0]
TestClassName = int(Testfile.split('_')[0])
TestVector = img2vector(r'D:\ipython\num_recognize\testDigits\%s'%Testfile)
result = classify0(TestVector,TrainMat,NumLabels,3)
print('the result is %d,the real answer is %d\n'%(result,TestClassName))
if result!=TestClassName:
error_cnt+=1
print('the total num of errors is %f\n'%error_cnt)
print('the error rate is %f\n'%(error_cnt/float(M)))
這里需要首先導(dǎo)入listdir方法,from os import listdir,它可以列出給定目錄的文件名。對(duì)于測(cè)試的每個(gè)文件,如果識(shí)別的分類結(jié)果跟真實(shí)結(jié)果不一樣,則錯(cuò)誤數(shù)+1,最終用錯(cuò)誤數(shù)/測(cè)試總數(shù) 來表示該模型的性能。下面給出結(jié)果

這里測(cè)試的總共946個(gè)項(xiàng)目中,一共有10個(gè)出現(xiàn)了錯(cuò)誤,出錯(cuò)率為1%,這個(gè)性能還是可以接受的。有了上一篇內(nèi)容的理解,這篇就簡(jiǎn)單多了吧!
訓(xùn)練數(shù)據(jù)集和測(cè)試集文件下載
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決PyCharm IDE環(huán)境下,執(zhí)行unittest不生成測(cè)試報(bào)告的問題
這篇文章主要介紹了解決PyCharm IDE環(huán)境下,執(zhí)行unittest不生成測(cè)試報(bào)告的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
python json load json 數(shù)據(jù)后出現(xiàn)亂序的解決方案
今天小編就為大家分享一篇python json load json 數(shù)據(jù)后出現(xiàn)亂序的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
spark dataframe 將一列展開,把該列所有值都變成新列的方法
今天小編就為大家分享一篇spark dataframe 將一列展開,把該列所有值都變成新列的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
python實(shí)現(xiàn)文件快照加密保護(hù)的方法
這篇文章主要介紹了python實(shí)現(xiàn)文件快照加密保護(hù)的方法,涉及Python文件加密的技巧,可有效防止文件被篡改,需要的朋友可以參考下2015-06-06
Python利用yarl實(shí)現(xiàn)輕松操作url
在諸如網(wǎng)絡(luò)爬蟲、web應(yīng)用開發(fā)等場(chǎng)景中,我們需要利用Python完成大量的url解析、生成等操作。本文為大家介紹了Pythonyarl操作url的方法,需要的可以了解一下2022-10-10
Pandas數(shù)值排序 sort_values()的使用
本文主要介紹了Pandas數(shù)值排序 sort_values()的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
python基礎(chǔ)知識(shí)之try...except...的詳細(xì)用法實(shí)例
在各種編程語(yǔ)言進(jìn)行工作和學(xué)習(xí)的過程中,都會(huì)有一些錯(cuò)誤異常,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)知識(shí)之try...except...的詳細(xì)用法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
用python按照?qǐng)D像灰度值統(tǒng)計(jì)并篩選圖片的操作(PIL,shutil,os)
這篇文章主要介紹了用python按照?qǐng)D像灰度值統(tǒng)計(jì)并篩選圖片的操作(PIL,shutil,os),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Django零基礎(chǔ)入門之路由path和re_path詳解
這篇文章主要介紹了Django零基礎(chǔ)入門之路由path和re_path,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09

