2.3 手寫識別系統
從os模組中匯入listdir函式,用來讀取給定目錄中的檔名
from os import listdir
關於zeros函式的使用,
**及注釋
#image convert to vector
def img2vector(filename):
returnvect = zeros((1,1024))
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
def handwritingclasstest():
hwlabels =
trainingfilelist = listdir('digits/trainingdigits')
m = len(trainingfilelist)#訓練樣本的個數
trainingmat = zeros((m,1024))#建立訓練矩陣,每行有1024個元素,表示乙個訓練樣本
for i in range(m):
filenamestr = trainingfilelist[i]#第i個訓練樣本
filestr = filenamestr.split('.')[0]
classnumstr = int(filestr.split('_')[0])#樣本命名的第乙個數字表示實際的分類
trainingmat[i,:] = img2vector('digits/trainingdigits/%s'%filenamestr)#將所有樣本轉換成矩陣,得到訓練樣本集
testfilelist = listdir('digits/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 = img2vector('digits/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 "\nthe total number of errors is:%d"%errorcount
print "\nthe total error rate is:%f"%(errorcount/float(mtest))
終端結果
k-近鄰演算法總結:摘自《機器學習實戰》
簡單的說,該演算法採用測量不同特徵值之間的距離方法進行分類,缺陷:
1. 必須儲存全部資料集,如果訓練資料集很大,必須使用大量的儲存空間
2.必須對每個資料計算距離值,耗時大
3.無法給出任何資料的基礎結構資訊,無法知曉平均例項樣本和典型例項樣本具有什麼特徵
機器學習實戰之K 近鄰演算法
k 近鄰演算法工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的資料進行比較,然後演算法提取樣本集中特徵最相似資料 最鄰近 的分類標籤。一般來說,我們只選取樣本資料集...
機器學習實戰之 k 近鄰演算法
k 近鄰演算法 knn 採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定。缺點 計算複雜度高 空間複雜度高。適用資料範圍 數值型和標稱型。描述 存在乙個樣本資料集合,樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸人沒有標籤的新資料...
機器學習實戰之k近鄰演算法
k近鄰演算法 或者說k最近鄰 knn,k nearestneighbor 在乙個空間中有許多樣本,這時候來了乙個新的樣本即測試點,那麼如何判斷這個樣本的類別。做法就是求測試點和空間中每個樣本的距離,用距離最近的前k個判斷。比如下圖新來了乙個點,這時候k 3,離它最近的3個點就是乙個為正方形,兩個為三...