kNN實現手寫數字識別系統

2021-10-20 22:33:10 字數 3209 閱讀 1688

總結

from numpy import *

import operator

from os import listdir

import numpy as np

#向量化,對每個32

*32的數字向量化為1

*1024

def img2vector

(filename)

: returnvect =

zeros((

1,1024

))#numpy矩陣,1

*1024

fr =

open

(filename)#使用open函式開啟乙個文字檔案

for i in range(32

):#迴圈讀取檔案內容

linestr = fr.

readline

()#讀取一行,返回字串

for j in range(32

):returnvect[0,

32*i+j]

=int

(linestr[j]

)#迴圈放入1

*1024矩陣中

return returnvect

測試**如下

#>>

> import knn

#>>

> testvector = knn.

img2vector

('testdigits/0_13.txt'

)#>>

> testvector[0,

0:31]

#>>

> testvector[0,

32:63]

自行測試~

def handwritingclasstest()

: hwlabels =

#定義乙個list,用於記錄分類

trainingfilelist =

listdir

('trainingdigits'

)#獲取訓練資料集的目錄

#os.listdir可以列出dir裡面的所有檔案和目錄,但不包括子目錄中的內容

#os.walk可以遍歷下面的所有目錄,包括子目錄

m =len(trainingfilelist)#求出檔案的長度

trainingmat =

zeros

((m,

1024

))#訓練矩陣,生成m*

1024的array,每個檔案分配1024個0

for i in range

(m):#迴圈,對每個file

filenamestr = trainingfilelist[i]#當前檔案

#9_45.txt,9代表分類,45表示第45個

filestr = filenamestr.

split

('.')[

0]#首先去掉txt

classnumstr =

int(filestr.

split

('_')[

0])#然後去掉_,得到分類

hwlabels.

(classnumstr)#把分類新增到標籤上

trainingmat[i,:]

=img2vector

('trainingdigits/%s'

%filenamestr)#進行向量化

testfilelist =

listdir

('testdigits'

)#處理測試檔案

errorcount =

0.0#計算誤差個數

mtest =

len(testfilelist)#取得測試檔案個數

for k in range(1

,20):#遍歷不同k對錯誤率的影響

errorcount =

0.0for i in range

(mtest)

:#遍歷測試檔案

filenamestr = testfilelist[i]

filestr = filenamestr.

split

('.')[

0]classnumstr =

int(filestr.

split

('_')[

0]) vectorundertest =

img2vector

('trainingdigits/%s'

%filenamestr)

#注意下面用到的classify0即是在上一節講解knn的時候所寫的方法,學習的時候記得放進來

classifierresult =

classify0

(vectorundertest,trainingmat,hwlabels,k)

#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 rate is:%f'

%(errorcount/

float

(mtest)))

print

('k is {} and the correct rate is{}%'

.format

(k,(mtest-errorcount)

*100

/mtest)

)

測試**如下

#測試

#>>

> import knn

#>>

> knn.

handwritingclasstest

()

自行測試~

這一節通過手寫數字識別系統的練習,可以看出k-近鄰演算法雖然是分類資料最簡單最有效的演算法,但是如果資料集很大時,實際非常耗時,而且模型不需要訓練,也就是說我們不知道例項到底具有什麼特徵,無法知道資料的基礎結構資訊。

歡迎交流~

KNN演算法實現手寫識別系統

created on 2015 3 13 author lzy from numpy import import operator from os import listdir def classify0 inx,dataset,labels,k datasetsize dataset.shape ...

機器學習 手寫數字識別系統

需要兩個資料報,裡邊有許多數字影象,像這樣 資料報import numpy as np import operator from os import listdir 分類函式 def classfy0 inx,dataset,labels,k 引數分別為測試樣本,訓練樣本,訓練樣本標籤,近鄰個數 d...

KNN手寫數字識別

以歐幾里得距離度量樣本間的相似程度。對於乙個測試樣本首先計算該樣本與每個訓練樣本間的距離,然後按距離值對訓練樣本進行公升序排序,排序後前k個樣本進行投票,即哪個標籤出現的次數多,就將測試樣例劃為該類。程式使用資料 預先將資料處理為,標籤資訊轉化為txt文件。from numpy import imp...