機器學習 k 近鄰演算法(手寫字識別)

2021-08-16 07:50:45 字數 2455 閱讀 4030

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