KNN演算法實現手寫識別系統

2021-06-29 02:56:09 字數 2433 閱讀 4788

'''

created on 2015-3-13

@author: lzy

'''from numpy import *

import operator

from os import listdir

def classify0(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()

classcount={}

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

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

sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true)

return sortedclasscount[0][0]

def image2vector(filename):

returnvect = zeros((1,1024))

fr = open(filename)

for i in range(32):

linestr = fr.readline()

for j in range(32):

returnvect[0,i*32 + j] = int(linestr[j])

return returnvect

def handwritingclasstest():

hwlabels =

trainingfilelist = listdir('trainingdigits')

m = len(trainingfilelist)

trainingmat = zeros((m,1024))

for i in range(m):

filenamestr = trainingfilelist[i]

filestr = filenamestr.split('.')[0]

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

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

testfilelist = listdir('testdigits')

errorcount = 0.0

mtest = len(testfilelist)

for i in range(mtest):

filenamestr = testfilelist[i]

filestr = filenamestr.split('.')[0]

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

vectorundertest = image2vector('testdigits/%s' % filenamestr)

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

print "the classifier came back with : %d, the real answer is :%d" % (classifierresult, classnumstr)

if (classifierresult != classnumstr): errorcount += 1.0

print "the total error rate is %f" % (errorcount / float(mtest))

handwritingclasstest()

執行結果:the total error rate is 0.011628

classifiy0實現了knn分類演算法;image2vector是將轉換為一維向量的形式,這裡的影象是經過處理的32畫素*32畫素的黑白影象;handwritingclasstest則是訓練資料、**資料;該演算法的準確率為0.011628。

numpy.tile(a,reps)是把a重複reps次來構造陣列;

argsort函式返回的是陣列值從小到大的索引值

from os import listdir 這段**的主要功能是從os模組中匯入函式listdir,它可以列出給定目錄的檔名。

kNN實現手寫數字識別系統

總結 from numpy import import operator from os import listdir import numpy as np 向量化,對每個32 32的數字向量化為1 1024 def img2vector filename returnvect zeros 1,10...

手寫識別系統(k 近鄰演算法)

k 近鄰演算法 knn 是機器學習中乙個相對比較簡單的演算法。該演算法在訓練集中資料和標籤已知的情況下,輸入測試資料,將測試資料的特徵與訓練集中對應的特徵進行相互比較 比如通過歐氏距離 找到訓練集中與之最為相似的前k個資料,則該測試資料對應的類別就是k個資料中出現次數最多的那個分類,其演算法的描述為...

k 近鄰演算法 手寫識別系統

手寫數字是32x32的黑白影象。為了能使用knn分類器,我們需要把32x32的二進位制影象轉換為1x1024 from numpy import 匯入科學計算包numpy和運算子模組operator import operator from os import listdir def img2vec...