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