機器學習五 KNN

2021-09-02 05:35:30 字數 3022 閱讀 2078

#手寫識別 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矩陣...