機器學習(二) kNN手寫數字識別

2022-09-11 09:27:07 字數 4049 閱讀 2511

一、knn演算法

1、knn演算法是機器學習的入門演算法,其中不涉及訓練,主要思想是計算待測點和參照點的距離,選取距離較近的參照點的類別作為待測點的的類別。

2,距離可以是歐式距離,夾角余弦距離等等。

3,k值不能選擇太大或太小,k值含義,是最後選取距離最近的前k個參照點的類標,統計次數最多的記為待測點類標。

4,歐式距離公式:

二、關於knn實現手寫數字識別

1,手寫數字訓練集測試集的資料格式,本篇文章說明的是《機器學習實戰》書提供的檔案,將所有數字已經轉化成32*32灰度矩陣。

三、**結構構成

1,data_prepare.py :在這個檔案放資料處理的函式,最終返回合適格式的資料集

2,knn_algorithm.py :在這個檔案中存放knn分類演算法的核心函式,即執行決策的分類函式

3,testknn_test.py :這個檔案用於測試一波資料,計算函式的錯誤率

四、**如下

1,data_prepare.py

1

import

numpy as np

2def

img2_vector(filename):

3 return_vect = np.zeros((1,1024))

4 fr =open(filename)

5for i in range(32):

6 linestr =fr.readline()

7for j in range(32):

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

9return return_vect

解釋:可以看出返回乙個1行1024列的向量,這是把乙個影象的32*32展開表示成一行,為後面計算歐式距離做準備。

2,knn_algorithm.py 

1

#匯入knn演算法所需的兩個模組,(1)numpy科學計算包(2)operator運算子模組

2import

numpy as np

3import

operator45

#定義k近鄰演算法函式classify0,[引數說明:inx待**的物件,dataset訓練資料,labels訓練資料對應的標籤,選取的前k相近]

6def

classidy0(inx,dataset,labels,k):78

#1,計算距離

9 dataset_size =dataset.shape[0]

10 diff_mat = np.tile(inx,(dataset_size,1))-dataset

11 sqdiff_mat = diff_mat**2

12 sq_distances = sqdiff_mat.sum(axis=1)

13 distances = sq_distances**0.5

1415

#2,按遞增排序

16 sorted_distances_index =distances.argsort()

1718

#3,選擇距離最近的前k個點,並且計算它們類別的次數排序

19 class_count ={}

20for i in

range(k):

21 vote_label =labels[sorted_distances_index[i]]

22 class_count[vote_label] = class_count.get(vote_label,0) + 1

23 sorted_class_count = sorted(class_count.items(),key=operator.itemgetter(1),reverse=true)

2425

#4,返回前k個裡面統計的最高次類別作為**類別

26return sorted_class_count[0][0]

解釋:此函式是分類函式,四個引數,定義k近鄰演算法函式classify0,[引數說明:inx待**的物件,dataset訓練資料,labels訓練資料對應的標籤,選取的前k相近]。最後會返回分類的類別。

3,testknn_test.py

1

from os import listdir #

列出給定目錄的檔名#

2import

knn_algorithm

3import

numpy as np

4import

data_prepare

5def

class_test():67

#獲取訓練集目錄下的所有檔案#

8 labels =

9 train_file_list = listdir('

trainingdigits')

10 m_train =len(train_file_list)

11 train_mat = np.zeros((m_train,1024))

12for i in

range(m_train):

13 file_str =train_file_list[i]14#

filename1 = 'trainingdigits/'+file_str#

15 file_name = file_str.split('.'

)[0]

16 class_num = file_name.split('_'

)[0]

訓練集所有檔案對應的分類label#

18 train_mat[i,:]=data_prepare.img2_vector('

trainingdigits/%s

' %file_str) #

每個訓練集特徵#

1920 test_file_list = listdir('

testdigits')

21 error_count = 0.0

22 m_test =len(test_file_list)

2324

for i in

range(m_test):

25 file_str =test_file_list[i]26#

filename2 = 'testdigits/'+file_str

27 file_name = file_str.split('.'

)[0]

28 class_num = file_name.split('_'

)[0]

29 vector_under_test = data_prepare.img2_vector('

testdigits/%s

' %file_str)

30 classifier_result = knn_algorithm.classidy0(vector_under_test,train_mat,labels,3) #

進行一次測試#

31print("

the classifier came back with:%d, the real answer is : %d

" %(int(classifier_result),int(class_num)))

32if (classifier_result!=class_num):error_count+=1

3334

print('

\n the total number of errors is : %d

' %error_count)

35print('

\n the total error rate is : %f

'%(error_count/float(m_test)))

解釋:可以看出這個**是乙個測試函式,寫的略顯複雜,真實的意思就是迴圈呼叫第二個函式,計算錯誤率。

五、其餘說明

機器學習案例 基於KNN手寫數字識別

演算法介紹 之前已經介紹過,簡單來說,k nn可以看成 有那麼一堆你已經知道分類的資料,然後當乙個新資料進入的時候,就開始跟訓練資料裡的每個點求距離,然後挑離這個訓練資料最近的k個點看看這幾個點屬於什麼型別,然後用少數服從多數的原則,給新資料歸類。演算法步驟 演算法步驟 step.1 初始化距離為最...

機器學習基礎 KNN實現手寫數字識別

k 近鄰演算法是一種監督機器學習分類演算法。它的思想很簡單,計算測試點與樣本集合之間的歐幾里得距離 直線距離 找到測試點與樣本集合中距離最近的k個樣本集,這k個樣本集合中對應的最多的分類就可以作為測試點的分類。本文使用的資料集,解壓後的testdigits資料夾為測試檔案,trainingdigit...

KNN手寫數字識別

以歐幾里得距離度量樣本間的相似程度。對於乙個測試樣本首先計算該樣本與每個訓練樣本間的距離,然後按距離值對訓練樣本進行公升序排序,排序後前k個樣本進行投票,即哪個標籤出現的次數多,就將測試樣例劃為該類。程式使用資料 預先將資料處理為,標籤資訊轉化為txt文件。from numpy import imp...