knn演算法在簡單二維資料上計算時:d=根號((x0-x)^2 -(y0-y)^2).這裡被推廣到1024維,將32*32二進位制當成1*1024的向量。計算上和二維是一樣的。
缺點是計算量太大了。
#!/usr/bin/python
# -*- coding: utf-8 -*
#用knn識別手寫數字
from numpy import *
import operator
from os import listdir
#把32*32的二進位制影象矩陣轉換為1*1024的向量
defimg2vector
(filename):
resultvect = zeros((1,1024))
fo = open(filename)
for i in range(32):
linestr = fo.readline()
for j in range(32):
resultvect[0,32*i+j] = int(linestr[j])
return resultvect
#inx是輸入向量,dataset是訓練樣本,標籤向量是labels,k是選擇最近鄰居的數目
defclassify0
(inx, dataset, labels, k):
datasetsize = dataset.shape[0]
diffmat = tile(inx, (datasetsize,1)) - dataset
sqdiffmat = diffmat**2
sqdistances = sqdiffmat.sum(axis=1) #按行計算
distances = sqdistances**0.5
sorteddistindicies = distances.argsort() #元素從小到大排列,提取其對應的index(索引),
classcount={}
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]
classcount[voteilabel] = classcount.get(voteilabel,0) + 1
#get返回指定值,不存在則返回0
sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true)
return sortedclasscount[0][0] #返回最小的值
#手寫數字識別,測試正確率
defhandwritingtest
(): labels =
trainfilelist = listdir('trainingdigits')
l = len(trainfilelist)
trainmat = zeros((l,1024)) #儲存所有的訓練向量
for i in range(l):
filename = trainfilelist[i]
filenamenum = int(filename.split('_')[0])
trainmat[i,:] = img2vector('trainingdigits/%s' % filename)
testfilelist = listdir('testdigits')
lt = len(testfilelist)
err = 0.0
for i in range(lt):
filename = testfilelist[i]
filenamenum = int(filename.split('_')[0])
vectortest = img2vector('trainingdigits/%s' % filename) #獲得乙個檔案的向量
classresult = classify0(vectortest,trainmat,labels,4)
print
"train: %d,ture: %d" % (classresult,filenamenum)
if(classresult != filenamenum):
err += 1.0
print
"\n errnum is %d" % err
print
"\n errrate is %f" % (err/float(lt))
if __name__ == '__main__':
handwritingtest()
改變k的值會改變正確率率,這裡選取k=4
基於K 近鄰演算法的手寫字元識別
收集資料集,包括trainingdigits和testdigits資料夾,資料夾下是字元影象的二進位制文字檔案,大小為32 32,如下圖所示 首先介紹listdir,它能返回資料夾路徑下的所有子檔案 import os from os import listdir listdir r c users...
機器學習實戰 使用K 近鄰演算法識別手寫數字
每張都是32畫素x32畫素 def img2vector filename 將32x32的影象轉化為1x1024的向量 param filename return return vect zeros 1,1024 fr open filename for i in range 32 用for lin...
機器學習實戰之k 近鄰演算法(KNN)識別手寫數字
機器學習實戰 第2章k 近鄰演算法之識別手寫數字 import numpy as np from os import listdir 用於獲取資料夾下的檔名 對目標元素進行分類 defclassify0 x,dataset,labels,k size dataset.shape 0 dis np.s...