機器學習從入門到放棄之KNN演算法

發表於2016-06-27

談起機器學習,真是令人心生嚮往同時又讓人頭痛不已。

心生嚮往是因為機器學習在很多方面都已經展現出其魅力,在人工智慧的領域比如說AlphaGo,計算機視覺領域的人臉識別,車牌識別,靠近生活的有推薦系統,使用者畫像情感分析等等,都或多或少用到機器學習的知識。其中大部分應用是相當能滿足程式設計師心中的極客精神的

但令人頭不痛不已的當你去涉足機器學習這個領域的時候,你會發現其中涉及大量的數學知識,這對很多程式設計師來說都很不友好。

但沒關係,程式設計師應該是工程師,而不是科學家,我們要做的是學會把理論落實成為生產力。

因此本系列將盡可能降低數學的描述(避免一長串的數學證明)來描述機器學習演算法的基本原理。如果需要對演算法進行深入瞭解和學習,那麼讀者還是應該學習演算法背後的數學原理。

好了,廢話不多說,馬上開講第一個機器學習的演算法,KNN演算法。

KNN演算法

演算法背景

假設,你是一個電影公司的影片分類員,你需要從一大堆影片裡面分類出武俠片愛情片,用肉眼一部部看肯定不科學,現在有一個程式能識別影片中的鏡頭,聰明的你想到了又麼麼噠的場面的一定是愛情片,有廝打場面的就是武俠片。

其中,麼麼噠廝打兩種場面則稱為特徵

你把這兩種特徵放入程式裡面一分類,咦,怎麼錯這麼多?!

然後,你決定開啟其中一兩個錯誤的結果看看……

咦,剛剛還刀劍相向的女主角怎麼怎麼和男主角吻了起來,臥槽,那可是你的殺父仇人啊喂,哦,原來男主角是被奸人所逼……

咦,這愛情片男女主角怎麼吻著吻著就廝打起來,臥槽,還要脫衣服,天啊,我還是個孩子……

你終於明白,錯誤的原因是因為無法將麼麼噠廝打作為單一特徵,這時,你明白需要重設設計分類的標準了。

演算法設計

牛逼的你發現,雖然無法將麼麼噠廝打作為唯一標準,但是是可以作為參考的。比如說,在武俠片中雖然也會出現麼麼噠的鏡頭,但顯然廝打鏡頭仍會佔主流。

於是你對以往已經分好類別的電影做出統計,並的做出以下表格。

其中這部分樣本又叫做訓練集

X=麼麼噠鏡頭的數量
Y=廝打鏡頭的數量
0代表愛情片,1代表武俠片

電影ID X Y 型別
1 10 2 0
2 8 3 0
3 2 6 1
…… …… …… ……

把它畫出二維圖大概是這樣:

機器學習從入門到放棄之KNN演算法

黃點代表1類電影的分佈,綠色代表0類電影的分佈,紫色代表需要分類的電影樣本。

那麼該怎麼判別紫色的那顆點所在的類別呢?

沒錯,KNN就是最簡單粗暴的方法,首先判別紫色點離黃色群體和離綠色群體距離,然後將紫色判斷為距離最近的那個群體。

這裡具體指出利用KNN的具體步驟:

  • 計算上述圖中所有點到達待測點的歐式距離(勾股定理計算)。
  • 選出離待測點最近的K個點,k由使用者指定。
  • 計算在這k個點中,各個型別的個數
  • 將個數最多的型別作為預測點的型別。

程式碼實現

KNN程式碼實現,收錄我的github上,點選一下連線並進入classify目錄下就可訪問

github

後話

在我的github中會慢慢更新TO DO LIST裡提及的演算法,但文章因需要語言總結會稍慢一點。

另外,本文題目是機器學習從入門到放棄之KNN演算法而非機器學習從入門到放棄(1):KNN演算法這樣,因為如果是後者,某日我要棄坑就會觸發我的強迫症,而前者並不會,哈哈哈。

如有錯誤,歡迎指點。

相關文章