kNN之手寫數字識別

2022-05-07 10:48:07 字數 3188 閱讀 1957

import

numpy as np

#listdir()列出給定目錄的檔名

from os import

listdir

import

operator

#inx-分類的輸入向量,dataset-輸入的訓練樣本集,labels-標籤向量,k-近鄰數

defclassify0(inx, dataset, labels, k):

datasetsize = dataset.shape[0] #

得到訓練集的行數,即樣本個數

#以下三行距離計算計算

#print("樣本個數:",datasetsize)

diffmat = np.tile(inx, (datasetsize, 1)) - dataset #

tile():拉伸copy

#將輸入的測試樣本沿行方向擴充為(4,2),減去訓練樣本的座標,得到各自的距離

#print("變形:",diffmat)

sqdiffmat = diffmat ** 2 #

歐式距離平方

sqdistances = sqdiffmat.sum(axis=1) #

歐式距離求和

distances = sqdistances ** 0.5 #

開方 sorteddistindicies = distances.argsort() #

按distances中的數值大小依次返回索引給y

#print("索引順序:",sorteddistindicies)

classcount ={}

#以下兩行選擇距離最小的k個點

for i in

range(k):

voteilabel =labels[sorteddistindicies[i]]

classcount[voteilabel] = classcount.get(voteilabel, 0) + 1

#0: 1:("b":2) 2:("a":1)

#get():返回指定鍵的值,如果值不在字典中返回預設值(此處設為0)#排序

#print("classcount.items():",classcount.items())

sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true)

#operator.itemgetter(x):定義函式,獲取物件的第x個域的值

#key為函式,指定取待排序元素的哪一項進行排序

#reverse = true 從大到小排序

#print("sortedclasscount:",sortedclasscount)

return

sortedclasscount[0][0]

#將影象轉換為向量

defimg2vector(filename):

returnvect = np.zeros(1024)

fr =open(filename)

for i in range(32):

linestr =fr.readline()

for j in range(32):

returnvect[32 * i + j] = int(linestr[j]) #

把逐行讀取到的單行的每一項依次賦給

return

returnvect

defhandwriteclasstest():

hwlabels =

trainingfilelist = listdir("

trainingdigits")

m = len(trainingfilelist) #

檔案個數

trainingmat = np.zeros((m, 1024)) #

m個樣本,每個樣本1024個資料

for i in

range(m):

#以下三行從檔名解析分類數字

filenamestr = trainingfilelist[i] #

獲取檔名

filestr = filenamestr.split('

.')[0] #

檔名去字尾

classnumstr = int(filestr.split('

_')[0]) #

獲取檔案資料所表示的值

#用樣本值替換全0陣列

trainingmat[i, :] = img2vector('

trainingdigits/%s

' %filenamestr)

testfilelist = listdir('

testdigits')

errorcount = 0.0mtest =len(testfilelist)

for i in

range(mtest):

filenamestr =testfilelist[i]

filestr = filenamestr.split('.'

)[0]

classnumstr = int(filestr.split('_'

)[0])

vectorundertest = img2vector('

testdigits/%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("

\nthe total number of errors is: %d

" %errorcount)

print("

\nthe total error rate is: %f

" % (errorcount /float(mtest)))

if__name__ == "

__main__":

handwriteclasstest()

KNN手寫數字識別

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

kNN 手寫數字識別

識別手寫的數字0 9,影象為32畫素 32畫素的黑白影象 1.將影象轉換為向量 將32 32的二進位制影象矩陣轉換為1 1024的向量。將影象轉化為向量 defimgvector filename returnvect zeros 1,1024 fr open filename 讀取檔案的前32行 ...

KNN手寫數字識別

import numpy as np import matplotlib pyplot as plt from sklearn.neighbors import kneighborsclassifier 讀取樣本資料,目標 0,1,2,3,4,5,6,7,8,9 feature target for...