這個是《機器學習實戰》的第二個例項,用knn演算法實現手寫識別,識別0-9這幾個數字;
要實現手寫識別功能,
首先將影象資料轉換為矩陣或者向量形式,本例使用32*32的二值影象,轉化成1*1024的陣列,具體**如下:
def img2vector(filename):
returnvect = zeros((1,1024)) #建立乙個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
要插入中文注釋,還需要在python指令碼檔案中的第一行或者第二行新增
#coding:gbk 或
#coding:utf-8 或
##-*- coding : gbk -*-
然後我們將資料輸入到分類器中,檢查效果
def handwritingclasstest():
hwlabels = #建立空陣列,儲存手寫標籤
trainingfilelist = listdir('trainingdigits') #trainingdigits目錄中的檔案內容儲存在列表中
m = len(trainingfilelist) #得到列表中的檔案數
trainingmat = zeros((m,1024)) #建立m*1024的訓練矩陣,每行儲存乙個圖形資訊
for i in range(m):
filenamestr = trainingfilelist[i]
filestr = filenamestr.split('.')[0] #得到檔名
classnumstr = int(filestr.split('_')[0])#得到標籤
trainingmat[i,:] = img2vector('trainingdigits/%s' % filenamestr) #載入影象資訊
testfilelist = listdir('testdigits') #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('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)) #總的錯誤率
順便討論下split函式的用法,
按某一字元分割
按某一字元分割n次,當n大於實際的分割數時,返回最大的分割狀態,n=2,效果和n=3、4、5、、n等等是一樣的
str_split = str.split('.',2)
n=1時,
str_split = str.split('.',1)
['www', 'baidu.com']
還可以賦值給變數
print str_split1結果如下
split字元分割用法參照 h t t p:
機器學習實戰2 2KNN識別手寫數字
from numpy import from os import listdir import knn 將32 32的二進位制影象矩陣轉換為1 1024的向量 def img2vector filename returnvect zeros 1 1024 fr open filename for i...
機器學習 KNN演算法 手寫識別
1.1 簡介 knn演算法即k最近鄰分類演算法,是機器學習的一種。從訓練樣本集中選取k個與測試樣本 距離 最近的樣本,這k個樣本中出現頻率最高的類別作為該測試樣本的類別。1.2 要求 目標 分類未知類別的案例。輸入 待分類未知類別案例專案 測試集 已知類別案例集合d 訓練集 輸出 未知類別案例的可能...
手寫數字識別 實戰 KNN演算法識別手寫數字
鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。下面是我學習knn演算法的思維導圖 其中距離的定義,各個距離的公式為 歐氏距離 n維空間的距...