詳解KNN演算法的python實現

2021-10-04 16:11:42 字數 3194 閱讀 1405

'''

本程式用knn演算法實現對手寫資料(0-9)的識別,k取值影響演算法正確率,大家可以自行測試

k = 8,錯誤率 22%

k = 5,錯誤率 17%

k = 4,錯誤率 14%

k = 3,錯誤率 11%

k = 2,錯誤率 13%

'''from numpy import * #科**算模組

import operator #運算子模組

from os import listdir

""" classify0(inx, dataset, labels, k)是knn演算法分類器,也是這個演算法的核心

inx 要識別的資料:1 x 1024陣列,乙個要識別的影象

dataset 訓練資料矩陣:m x 1024,每行是乙個訓練影象

labels 標籤,分類器:1 x m

k 選擇近鄰的幾個

"""def classify0(inx, dataset, labels, k):

datasetsize = dataset.shape[0] #讀取矩陣dataset第一維度長度

diffmat = tile(inx, (datasetsize,1)) - dataset

#把inx在行上覆製成datasetsize行,在列上覆製成1列,即不變。

#diffmat:m x 1024,要識別的資料與訓練資料矩陣的差值

sqdiffmat = diffmat**2 #sqdiffmat: m x 1024.各個元素分別平方

sqdistances = sqdiffmat.sum(axis=1)#sqdistances:1 x m ,對矩陣每行求和

distances = sqdistances**0.5 #開根號 distances :1 x m

#以上是求距離,就是座標上兩點之間距離的求法的拓展

sorteddistindicies = distances.argsort() #公升序排序,返回索引值 (2,4,1)排序後返回(2,0,1)

classcount={} #分類做key,次數做value

for i in range(k):

voteilabel = labels[sorteddistindicies[i]] #得到分類voteilabel

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

#get(voteilabel,0):如果字典中該(voteilabel,0)資料沒有則新增,如果有就獲取voteilabel對應的value值

sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true)#以value公升序排序,返回key-value二維陣列

return sortedclasscount[0][0] #返回出現次數最多的分類

"""img2vector(filename)把(32 x 32的二進位制)轉化成1 x1024 的向量(用陣列儲存)

"""def img2vector(filename):

returnvect = zeros((1,1024)) #建立1 x 1024的全0矩陣

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 #返回該陣列

"""handwritingclasstest()是測試分類器函式

"""def handwritingclasstest():

hwlabels = #儲存所有分類,0-9

trainingfilelist = listdir('trainingdigits') #listdir(path)獲取pat**件夾下的全部檔案目錄

m = len(trainingfilelist)

trainingmat = zeros((m,1024))# 建立m x 1024的訓練矩陣,每行都是乙個影象

for i in range(m):

#從檔名中解析分類數字,eg: 9_45.txt表示它是9 的第45個例項

filenamestr = trainingfilelist[i]

filestr = filenamestr.split('.')[0] #去掉 .txt

classnumstr = int(filestr.split('_')[0])

trainingmat[i,:] = img2vector('trainingdigits/%s' % filenamestr)

testfilelist = listdir('testdigits')

errorcount = 0.0

mtest = len(testfilelist)

for i in range(mtest):

filenamestr = testfilelist[i]

filestr = filenamestr.split('.')[0] #take off .txt

classnumstr = int(filestr.split('_')[0])

vectorundertest = img2vector('testdigits/%s' % filenamestr)# 1 x 1024陣列

classifierresult = classify0(vectorundertest, trainingmat, hwlabels, 15)

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

handwritingclasstest()

KNN演算法詳解

一些自己的見解,記錄下方便日後複習 encoding utf 8 from numpy import import operator def createdataset 生成二維矩陣,每行表示乙個樣本 group array 1.0,0.9 1.0,1.0 0.1,0.2 0.0,0.1 劃分四個樣...

python 機器學習 KNN最鄰近演算法的實現

coding utf 8 created on fri mar 22 21 21 48 2019 author wwq from sklearn import datasets import numpy as np knn演算法 iris datasets.load iris 資料集包含150個資料...

K NN近鄰演算法詳解

k 近鄰演算法屬於一種監督學習分類演算法,該方法的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。1 需要進行分類,分類的依據是什麼呢,每個物體都有它的特徵點,這個就是分類的依據,特徵點可以是很多,越多分類就越精確。2 機器學...