思路:
訓練集:trainingdigits資料夾內的32位二進位制影象矩陣
target向量:從trainingdigits資料夾內的檔名讀取影象矩陣所表示的數字
測試集:testdigits資料夾內的32位二進位制影象矩陣
predicted**值:從testdigits資料夾內檔名讀取影象矩陣所表示的數字
#手寫識別系統
#(2)準備資料:編寫函式img2vector(),將影象格式轉換為分類器使用的向量格式
#(3)分析資料:在anancode中檢查資料,確保它凡符合要求
#(4)訓練演算法:不適用於k-近鄰演算法
#(5)測試演算法:編寫函式,使用提供的部分資料集作為測試樣本,測試樣本與非測試樣本的區
# 別在於測試樣本已經完成分類的資料,如果**分類與實際分類不同,則標記為乙個錯誤
#(6)使用演算法:本例沒有完成此步驟,若你感興趣可以構建完整的應用程式,從影象中提取數字,
# 並完成數字識別,美國的郵件分揀系統就是乙個實際執行的類似系統。
#準備資料:將影象轉換為測試向量
#原資料為 32*32的二進位制影象矩陣,轉化為 1*1024的向量
import numpy as np
import operator
from os import listdir
defclassify
(inx, dataset, labels, k):
datasetsize = dataset.shape[0]
diffmat = np.tile(inx,(datasetsize,1)) - dataset
sqdiffmat = diffmat ** 2
sqdistance = sqdiffmat.sum(axis = 1)
distance = sqdistance ** 0.5
sortasdistance = distance.argsort()
classcount = {}
for i in range(k):
voteilabel = labels[sortasdistance[i]]
classcount[voteilabel] = classcount.get(voteilabel,0) +1
sortdeclasscount = sorted(classcount.items(),key=operator.itemgetter(1),reverse=true)
return sortdeclasscount[0][0]
defimgvector
(filename):
returnvec = np.zeros((1,1024))
fr = open(filename)
for i in range(32):
linestr = fr.readline()
for j in range(32):
returnvec[0,32*i+j]=int(linestr[j])
return returnvec
#測試演算法:使用k-近鄰演算法識別手寫數字
defhandwritingclasstest
(): hwlabels =
traningfilelist = listdir('trainingdigits')
#os.listdir() 方法用於返回指定的資料夾包含的檔案或資料夾的名字的列表。這個列表以字母順序。 它不包括 '.' 和'..' 即使它在資料夾中。
#只支援在 unix, windows 下使用。
m = len(traningfilelist)
trainingmat = np.zeros((m,1024)) #建立矩陣用於儲存讀取的資料
for i in range(m):
filenamestr = traningfilelist[i]
filestr = filenamestr.split('.')[0]
classnumstr = int(filestr.split('_')[0]) #以'_'為分隔符分割檔名稱元素,並取第乙個值
trainingmat[i,:] = imgvector('trainingdigits/%s' % filenamestr)
#上述程式,建立了矩陣 hwlabels 用於存放每個檔名的第乙個字元,即0~9,對應檔案內的影象矩陣
#建立了資料集 trainingmat 存放樣本資料
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 = imgvector('testdigits/%s' % filenamestr)
classifierresult = classify(vectorundertest,trainingmat,hwlabels,3)
print("the classifier came back with :%d , the real answer is :%d" % (classifierresult,classnumstr))
if classifierresult != classnumstr :
errorcount += 1
print("\nthe total number of errors is :%d" % errorcount)
print("the total error rate is :%f" % (errorcount/mtest))
機器學習(2) K 近鄰演算法講解
定義 採用測量不同特徵值之間的距離方法進行分類 優點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 在輸入乙個新資料後將新資料的每乙個特徵與樣本集中資料對應特徵進行比較,利用演算法提取樣本集中特徵最相似資料 最近鄰 的分類標籤,選取樣本資料集中前k個最相似資料 k一般小於20 ...
機器學習演算法 2 K近鄰演算法實戰
前言 這篇是 部分,不會涉及原理部分的闡述,但整個程式的實現會分為2種,一種是純手工 不用調庫,第二種方法是會借用sklearn的庫來實現。這裡使用的k近鄰案例是我們比較熟悉的手寫數值的識別,其中我會把訓練資料 測試資料 程式放在乙個同一檔案下。from numpy import from os i...
機器學習演算法 K鄰近演算法
coding utf 8 author whf from numpy import import operator def classify inx,dataset,labels,k 得到資料集的行數 shape方法用來得到矩陣或陣列的維數 datasetsize dataset.shape 0 t...