k-近鄰演算法(knn)是機器學習中乙個相對比較簡單的演算法。該演算法在訓練集中資料和標籤已知的情況下,輸入測試資料,將測試資料的特徵與訓練集中對應的特徵進行相互比較(比如通過歐氏距離),找到訓練集中與之最為相似的前k個資料,則該測試資料對應的類別就是k個資料中出現次數最多的那個分類,其演算法的描述為:
1)計算測試資料與各個訓練資料之間的距離;
2)按照距離的遞增關係進行排序;
3)選取距離最小的k個點;
4)確定前k個點所在類別的出現頻率;
5)返回前k個點中出現頻率最高的類別作為測試資料的**分類。
以下**是通過knn演算法實現的手寫識別系統。其中每個輸入資料為32*32的二值影象,資料儲存在txt檔案中(32行*32列)。檔案命名為諸如」0_0.txt」的形式。其中,」_」左邊的0為其實際標籤(實際類),右邊的0為資料的編號。
import numpy as np
from os import listdir
defreaddatatolist
(filename):
f=open(filename)
list=np.zeros((1,32*32))
for i in range(0,32):
eachline=f.readline()
for j in range(0,32):
list[0,32*i+j]=int(eachline[j])
return list
defknnclassify
(dataset,label,sample,k):
sizeof_dataset=len(label)
distanceset=np.zeros((1,sizeof_dataset))
for i in range(0,sizeof_dataset):
distance=0
for j in range(0,32*32):
distance+=((dataset[i][j]-sample[0][j])**2)
distance=distance**0.5
distanceset[0,i]=distance
sortdistindex=distanceset[0].argsort()
# print(sortdistindex)
maxvoted=0
classvoted={}
for i in range(0,k):
if(label[sortdistindex[i]] in classvoted):
classvoted[label[sortdistindex[i]]]+=1
else:
classvoted[label[sortdistindex[i]]]=1
if(classvoted[label[sortdistindex[i]]]>maxvoted):
maxvoted=classvoted[label[sortdistindex[i]]]
nearclass=label[sortdistindex[i]]
return nearclass
defhandwritingtest
(): trainingfilelist=listdir('trainingdigits')
trainingsamplenum=len(trainingfilelist)
trainingset=np.zeros((trainingsamplenum,32*32))
label=
for i in range(0,trainingsamplenum):
filename=trainingfilelist[i]
trainingset[i:]=readdatatolist('trainingdigits/%s' %filename)
testfilelist=listdir('testdigits')
errornum=0
testsamplenum=len(testfilelist)
for i in range(0,testsamplenum):
filename=testfilelist[i]
realclass=int(filename.split('_')[0])
sample=readdatatolist('testdigits/%s' %filename)
testedclass=knnclassify(trainingset,label,sample,3)
if(realclass!=testedclass):
errornum+=1
print("case %d:the real class is:%d, the answer is:%d" %(i,realclass,testedclass))
print("the total number of errors is:%d" %errornum)
print("the total error rate is: %f" %(errornum/float(testsamplenum)))
handwritingtest()
測試結果:
得到同樣的結果:
當然,k值設定不同、計算距離方式的不同、投票方式的不同、甚至訓練樣本的權重,等等因素,都可能影響正確率和時間效率。knn的主要缺點是演算法思想相對比較簡單,時間效率不高(屬於平時不訓練,臨陣磨槍)。
k 近鄰演算法 手寫識別系統
手寫數字是32x32的黑白影象。為了能使用knn分類器,我們需要把32x32的二進位制影象轉換為1x1024 from numpy import 匯入科學計算包numpy和運算子模組operator import operator from os import listdir def img2vec...
使用k 近鄰演算法完成手寫識別系統
2 準備資料 編寫函式classify0,將影象格式轉換為分類器使用的list格式 3 分析資料 在python命令提示符中檢查資料,確保它符合要求 4 訓練演算法 此步驟不適合用於k 近鄰演算法 5 測試演算法 編寫函式使用提供的部分資料集作為測試樣本,測試樣本與非測試樣本的 區別在於測試眼 恩是...
機器學習 使用k 近鄰演算法實現手寫識別系統
knn概述 k 近鄰演算法就是通過計算不同特徵值之間的距離來進行分類的演算法。假設我們現在有乙個樣本集,每個樣本都有幾個特徵用來描述這個樣本,以及乙個它所屬分類的標籤。當我們拿到乙個沒有標籤的樣本時,該如何判斷它屬於哪個樣本呢?我們將這個樣本與每乙個已知標籤的樣本做比較,找到相似度最大的k個樣本,記...