K nn手寫數字識別 Python版

2021-08-13 11:06:47 字數 2734 閱讀 1756

模式識別的實驗作業,弄了乙個晚上終於在第二天中午弄明白了!

簡單來說,k-nn就是通過計算訓練集和 乙個測試資料之間的歐式距離,然後將計算結果按照從小到大來排序,找出最小的k個資料,分析k個資料中哪種情況出現的頻率最多,那麼這個測試資料就屬於這一類

思路讀入資料,假設100個訓練資料,將訓練資料轉換為100*1024的二維陣列,然後迴圈讀入測試資料,計算測試資料和100個訓練資料間的歐式距離:

x1-xn為單個訓練資料的所有元素,y1-yn為測試資料的所有元素

找出k個最近的距離,看哪個數字出現的頻率最多,那麼這個測試資料大概率為這個數字

#解壓檔案

defjy

(): path="/users/fanjialiang2401/pycharmprojects/模式識別/digits.zip"

newpath="/users/fanjialiang2401/pycharmprojects/模式識別/"

f=zipfile.zipfile(path,'r')

for file in f.namelist():

f.extract(file,newpath)

print("success!")

# 將32*32矩陣轉換為乙個長為1024的一位數字

deftoverctor

(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;

# 測試 trainlist為訓練集所有資料,testdata為測試資料 classlable為

defclassfiy

(trainlist,testdata,classlable,k):

listsize=len(trainlist)

diffs=

for i in range(listsize):

traindata=trainlist[i];

diffvalue=np.sum(np.square(traindata-testdata))

diff=np.sqrt(diffvalue)

sortindex=np.argsort(diffs)

#sortindex argsort對所有元素進行排序,返回的是序號值

num=

for i in range(10):

for i in range(k):

num[int(classlable[sortindex[i]])]+=1;

# 找出出現頻率最多的數

s=np.argsort(num)

return s[9]

#讀取並且處理檔案 相當於main方法 在這裡呼叫其他方法

defread

(): hwlable=

# 將讀入的資料32*32轉換為1024*length的陣列

trainlist=os.listdir('trainingdigits')

length=len(trainlist)

trainmat=np.zeros((length,1024))

for i in range (length):

# 讀取檔名

filename=trainlist[i]

filestr=filename.split(".")[0]

#通過字串分割,得到數字

classnum=filestr.split('_')[0]

trainmat[i:]=toverctor('trainingdigits/%s'%filename)

# 測試集

# 測試檔案 迴圈比較

testfilelist=os.listdir('testdigits')

errorcount=0;

testlength=len(testfilelist)

for i in range(testlength):

filenamestr=testfilelist[i]

filestr=filenamestr.split(".")[0]

classstr=filestr.split("_")[0]

# 測試向量

testvector=toverctor('testdigits/%s'%filenamestr)

lable=classfiy(trainmat,testvector,hwlable,5)

if lable!=int(classstr):

errorcount+=1

print('false'+str(lable)+":"+classstr)

print("正確個數:"+str(testlength-errorcount))

print("正確率:"+str((testlength-errorcount)/testlength))

結果:

看的出正確率還挺高的

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...