機器學習實戰 使用K 近鄰演算法識別手寫數字

2021-07-29 13:02:51 字數 2282 閱讀 6705

每張都是32畫素x32畫素

def img2vector(filename):

"""將32x32的影象轉化為1x1024的向量

:param filename:

:return:

"""return_vect = zeros((1, 1024))

fr = open(filename)

for i in range(32): # 用for line in readlines()也可以

line_str = fr.readline() # 一行一行的讀

for j in range(32):

return_vect[0, 32*i+j] = int(line_str[j])

fr.close()

return return_vect

有了上面的函式,就可以設計迴圈,把訓練集,測試集,標籤都準備成knn演算法輸入的標準格式了

這裡標籤的提取需要從檔名稱中提取,比如檔名稱為『0_23.txt』,則表示這個影象的正確分類為數字『0』

**如下:

from knn import classify0

from numpy import *

from os import listdir

# 手寫數字識別系統測試**

def handwriting_class():

hw_labels =

training_file_list = listdir('trainingdigits') # 獲取目錄下的檔名

m = len(training_file_list)

training_mat = zeros((m, 1024))

for i in range(m):

file_name_str = training_file_list[i]

file_str = file_name_str.split('.')[0]

class_num = int(file_str.split('_')[0])

training_mat[i, :] = img2vector(r'trainingdigits/%s' % file_name_str)

test_file_list = listdir('testdigits')

error_count = 0.0

m_test = len(test_file_list)

for i in range(m_test):

file_name_str = test_file_list[i]

file_str = file_name_str.split('.')[0]

class_num = int(file_str.split('_')[0])

vector_under_test = img2vector(r'testdigits/%s' % file_name_str)

classifier_result = classify0(vector_under_test, training_mat, hw_labels, 3)

print 'the classifier came back with: %d, the real answer is: %d' % (classifier_result, class_num)

if classifier_result != class_num:

error_count += 1.0

print '\nthe total number of errors is : %d' % error_count

print '\nthe total error rate is : %f' % (error_count/float(m_test))

handwriting_class()

執行結果:

錯誤率達到1.8%,很不錯的結果(這是k選5的結果)

改變變數k的值,改變訓練樣本的數目,都會對結果有影響。

實際使用這個演算法時,發現演算法速度比較慢,因為每個測試樣本都要與訓練樣本做距離計算,計算量非常大

k-近鄰演算法必須儲存全部資料集,如果訓練資料集很大,必須使用大量的儲存空間。另外,由於必須對資料集中每個資料計算距離,實際使用可能非常耗時。

《機器學習實戰》 K 近鄰演算法

基本原理 通過計算新資料與給定的樣本資料之間的距離,來確定相似度排名 然後取前k個最相似的樣本,統計這k 一般不大於20 個樣本中出現最多的分類,設為新資料的分類。新資料,訓練樣本集,樣本資料標籤 即分類 最近鄰 前k個最相似資料 最近鄰標籤 演算法實施 首先提取要比較的特徵,確定各特徵的權重,進行...

機器學習實戰 K 近鄰演算法

簡單的說,k 近鄰演算法採用測量不同特徵值之間的距離辦法進行分類.收集資料 可以使用任何方法。準備資料 距離計算所需要的數值,最好是結構化的資料格式。分析資料 可以使用任何方法。訓練演算法 此步驟不適用於k 近鄰演算法。測試演算法 計算錯誤率。使用演算法 首先需要輸入樣本資料和結構化的輸出結果,然後...

機器學習實戰 k 近鄰演算法

本系列是基於 機器學習實戰 這本書做的讀書筆記,原書採用python2作為工具,我則將原書 改為用python3編寫並記錄在此系列中。我將把書中對這些機器學習演算法的定義謄上,然後寫下自己對該演算法的通俗理解,之後貼出書中演算法清單中的 本書講解的第乙個機器學習演算法是k 近鄰演算法 knn 它的工...