'''
本程式用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 機器學...