1. 程式人生 > >《機器學習實戰》(1)kNN小結(小白教學,每行程式碼都有註釋)

《機器學習實戰》(1)kNN小結(小白教學,每行程式碼都有註釋)

最近入坑了機器學習,為了快速提高自己的機器學習的程式碼能力,入坑了《機器學習實戰》,目前只學習了第一個重要演算法:k近鄰演算法(kNN),在學習過程中發現許多相關的學習資料要麼程式碼是python2的,要麼程式碼的解釋不夠詳細,對於像我這樣的菜雞而言苦不堪言,為了後來者不踩我踩過的大坑,現在將這一章的學習筆記做一個小結,全文有些長,請根據自己的需要檢視。

一.什麼是kNN

首先上一段李航《統計學習方法》裡kNN的演算法總結

用人話來說就是,對於某一個群體裡的某個個體,其某一特性取決於其周圍最近的k個人的該特性的多數值。

舉個例子,有一個100人的球迷群體,他們的主隊分別是巴薩和皇馬,現對於某一球迷(x),我們不知道他是皇馬球迷還是巴薩死忠,我們依據k近鄰演算法可以對其主隊(類)進行預測,假如取其周圍最近的9個球迷(與x最鄰近的k個點,這裡k=9)來統計他們的主隊(類別),發現其中5人為巴薩球迷,剩餘4人為皇馬球迷,我們就認為該球迷為巴薩球迷(多數表決)。

這個就是k近鄰演算法的基本原理,下面結合機器學習實戰,將這一演算法進行實踐。

注:程式語言:python3.5,資料庫來源:點選開啟連結  開啟後右側隨書下載——《機器學習實戰》原始碼.zip

二.第一個kNN演算法實踐

任務目標:自己建立一個基本資料集,並建立一個基本分類器,基於建立的基本資料集對某一資料進行分類

任務實施:

1.建立資料集

在kNNdemo3.py 檔案輸入下列程式碼:

這樣就建立了一個數據集,在這個資料集裡,group代表了其具體座標位置,labels代表了其標籤(屬性),下面基於該資料集建立了一個基本分類器,該分類器將通過座標,對其可能的屬性是‘A’還是‘B’進行預測。下面是分類器部分的程式碼:

注意:書裡為python2.7的程式碼,所以倒數第三行書裡用的是iteritems(),但在python3裡已經被item()代替

下面在terminal裡執行這個分類器:

這裡首先載入python,載入資料集後對[0,0]和[3,3]通過分類器分別判斷其標籤是‘A’還是‘B’

三.使用k-近鄰演算法選擇約會物件

任務目標:通過每年飛行里程數,玩視訊遊戲所耗時間,冰淇淋消耗數來確定約會物件是否是意中人

任務實施:

因為我們的資料是以文字形式儲存的,所以需要將文字轉換為numpy矩陣,以便於將其帶入現有函式來分類。程式碼如下:

現在這一文字檔案已經轉換為了所需要的陣列形式,現在這個問題就已經轉換為之前的分類問題了,但是在分類前還需要對其進行歸一化處理,程式碼如下:

現在,我們再將現有資料帶入具體問題,以分類器的形式來實現這個問題,並整合為一個函式,程式碼如下:

現在在terminal上再對文字資料處理一下,看看該演算法,對於這個資料集效果如何:

不難發現,其錯誤率只有5%,所以演算法效果不錯,故我們以此演算法為基礎,來實現對於約會物件滿意度的預測模型,程式碼如下:


現在我們在terminal上對資料進行處理,對應的互動程式碼如下:

這一段程式碼首先過載了kNNdemo3這個模組,每一次更新程式碼後都需要過載模組,值得注意的是,原來書上寫的reload(kNNdemo3),但是在python3裡不能這麼寫,必須現載入imp模組,再reload。後面執行的就是預測模型,以預測是否合適。

四.手寫識別演算法

任務目標:通過訓練模型,希望模型能準確識別0-9的數字影象

任務實施:

首先要對影象進行預處理,前面我們獲取的均是向量,雖然影象本質上也是種向量,但這種向量並不是我們之前分類器所使用的向量,為了方便處理,這裡我們將影象均依次轉化為一維向量,程式碼如下:

下面就是帶入一個分類器,來實現手寫影象識別,,在這裡使用了listdir方法和skelearn庫,以便於後面運算,這裡需在檔案里加上這兩行程式碼:


再寫入手寫影象識別函式:

最後在terminal上執行這個函式,得到的結果如下:

錯誤率只有1.34%,令人滿意,所以我們可以認為這個演算法滿足我們的需要。

注:本文參考資料:李航《統計學習方法》,Peter Harrington《機器學習實戰》,手寫識別系統sklearn程式碼源自Jack Cui,其主頁:點選開啟連結