一、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解釋:可以看出返回乙個1行1024列的向量,這是把乙個影象的32*32展開表示成一行,為後面計算歐式距離做準備。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
2,knn_algorithm.py
1解釋:此函式是分類函式,四個引數,定義k近鄰演算法函式classify0,[引數說明:inx待**的物件,dataset訓練資料,labels訓練資料對應的標籤,選取的前k相近]。最後會返回分類的類別。#匯入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]
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...