#手寫識別 32x32
from numpy import *
import operator
import time
from os import listdir
def classify(inputpoint,dataset,labels,k):
datasetsize = dataset.shape[0] #已知分類的資料集(訓練集)的行數
#先tile函式將輸入點拓展成與訓練集相同維數的矩陣,再計算歐氏距離
diffmat = tile(inputpoint,(datasetsize,1))-dataset #樣本與訓練集的差值矩陣
sqdiffmat = diffmat ** 2 #差值矩陣平方
sqdistances = sqdiffmat.sum(axis=1) #計算每一行上元素的和
distances = sqdistances ** 0.5 #開方得到尤拉距離矩陣
sorteddistindicies = distances.argsort() #按distances中元素進行公升序排序後得到的對應下標的列表
#選擇距離最小的k個點
classcount = {}
for i in range(k):
voteilabel = labels[ sorteddistindicies[i] ]
classcount[voteilabel] = classcount.get(voteilabel,0)+1
#按classcount字典的第2個元素(即類別出現的次數)從大到小排序
sortedclasscount = sorted(classcount.items(), key = operator.itemgetter(1), reverse = true)
return sortedclasscount[0][0]
def img2vector(filename):
returnvect =
fr = open(filename)
for i in range(32):
linestr = fr.readline()
for j in range(32):
return returnvect
#從檔名中解析分類數字
def classnumcut(filename):
filestr = filename.split('.')[0]
classnumstr = int(filestr.split('_')[0])
return classnumstr
#構建訓練集資料向量,及對應分類標籤向量
def trainingdataset():
hwlabels =
trainingfilelist = listdir('trainingdigits') #獲取目錄內容
m = len(trainingfilelist)
trainingmat = zeros((m,1024)) #m維向量的訓練集
for i in range(m):
filenamestr = trainingfilelist[i]
trainingmat[i,:] = img2vector('trainingdigits/%s' % filenamestr)
return hwlabels,trainingmat
#測試函式
def handwritingtest():
hwlabels,trainingmat = trainingdataset() #構建訓練集
testfilelist = listdir('testdigits') #獲取測試集
errorcount = 0.0 #錯誤數
mtest = len(testfilelist) #測試集總樣本數
t1 = time.time()
for i in range(mtest):
filenamestr = testfilelist[i]
classnumstr = classnumcut(filenamestr)
vectorundertest = img2vector('testdigits/%s' % filenamestr)
#呼叫knn演算法進行測試
classifierresult = classify(vectorundertest, trainingmat, hwlabels, 3)
if (classifierresult != classnumstr): errorcount += 1.0
print("\nthe total number of tests is: %d" % mtest ) #輸出測試總樣本數
print("the total number of errors is: %d" % errorcount ) #輸出測試錯誤樣本數
print("the total error rate is: %f" % (errorcount/float(mtest)) ) #輸出錯誤率
t2 = time.time()
print("cost time: %.2fmin, %.4fs."%((t2-t1)//60,(t2-t1)%60) ) #測試耗時
if __name__ == "__main__":
handwritingtest()
最後執行的結果:
the total number of tests is: 946
the total number of errors is: 10
the total error rate is: 0.010571
cost time: 0.00min, 44.5615s.
在測試集上效果還是很好的。
機器學習(五) KNN與維度災難
作為乙個過渡,這一節記錄關於knn的知識。這篇部落格不貼關於knn的具體細節了,knn是十分容易理解的,關於knn可參考的部落格一大堆,貼乙個講的好的吧乙隻兔子理解knn 選擇樣本資料集中與待 值前k個最相似的樣本,取其中最多的作為該待 值的類 如果希望knn不給出所述的類,給出可能所述類的概率也是...
機器學習 KNN
posted on 2015 05 21 20 34 in ml 0 comment views 3195 原始碼 決策樹和基於規則的分類器都是積極學習方法 eager learner 的例子,因為一旦訓練資料可用,他們就開始學習從輸入屬性到類標號的對映模型。乙個相反的策略是推遲對訓練資料的建模,直...
機器學習 KNN
定義事件ejl j 0,1.k e j epsilon 0,1.k ejl j 0,1.k 為對於標籤 l,k個鄰居中包換j個這個標籤,則 e為乙個 k n 的矩陣,每一行為距離該例項的樣本中每個標籤的數量,則 c l 向量是e矩陣的最後一行,表示距離為k時的各個標籤數量。則我們需要的是在已知e矩陣...