1. 程式人生 > >機器學習之K-近鄰演算法程式碼分析

機器學習之K-近鄰演算法程式碼分析

在看Peter的K-近鄰實戰時,發現原來“手寫識別系統”不止是影象處理和影象識別可以解決,原來從影象也是矩陣資料的層面來看,不同數字的識別也是資料分類問題(2333……又打開了思維的新視角)。因本身是學影象處理出身,所以關於手寫識別系統,思維受限在怎樣進行影象處理、怎樣訓練數字模型、怎樣進行數字識別了。

該文先簡單在Jupyter上實現K-近鄰演算法。後續會專門通過一步步構造使用K-近鄰分類器實現手寫識別系統(識別數字0~9)。

基礎知識準備——Python匯入資料

在構造K-近鄰演算法之前,我們需要先編寫一些通用函式,我們可以把所有的通用函式寫的一個python檔案(.py)下。下面寫個例子,看下python裡怎樣寫通用函式並呼叫。小編使用的Jupyter(可以直接在notebook下編寫通用函式和測試,建立.py可選)。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

依次執行Cells。In[4]和In[5]是定義了通用函式createDataSet(),函式裡寫死了一組資料和對應標籤,標籤有兩類A和B。我們通過這個簡單例子,可以大致瞭解Python如何解析資料和載入資料,上一篇瞭解了KNN演算法的工作原理。下面使用這些知識和方法完成分類任務。

基礎知識準備——文字檔案中解析資料

該部分實現功能:使用k-近鄰演算法將魅族資料劃分到某個類中,程式碼和釋義如下:

0?wx_fmt=png

輸入引數inX:用於分類的輸入向量;

輸入引數dataSet:輸入的訓練樣本集

輸入引數labels:標籤向量(元素數目和dataSet的行數相同)

輸入引數k:用於選擇最近鄰的數目。

計算兩個向量點xA和xB之間的距離用的歐式距離:

0?wx_fmt=png

計算完所有點之間的距離後,對資料按照從小到大的次序排序。然後確定前k個距離最小元素所在的主要分類,輸入k總是正整數。最後,將classCount字典分解為元組列表,然後匯入運算子模組的itemgetter方法,按照第二個元素的次序對元組進行排序。此處的排序為逆序,即按照從最大到最小次序排序,最後返回發生頻率最高的元素標籤。

基礎知識準備——測試分類器

為了預測資料所在分類,執行:

0?wx_fmt=png

小結

在參照例項進行學習和測試的過程中,遇到了很多問題,有程式設計語法方面的,也有演算法理解上的。但不管怎樣,算是跑通了個例項。需要注意的是書裡提供的程式碼有些問題,有的問題是因為python版本變化引起的,也有書寫方式引起的,比如,在引用python模組時,儘量不要import *,需要用什麼就import什麼。

0?wx_fmt=jpeg

我能夠看得更遠,那是因為我站在巨人的肩上

 — 艾薩克·牛頓

0?wx_fmt=png

歡迎轉發到朋友圈或分享給好友