談起機器學習,真是令人心生嚮往同時又讓人頭痛不已。
心生嚮往是因為機器學習在很多方面都已經展現出其魅力,在人工智慧的領域比如說AlphaGo
,計算機視覺領域的人臉識別
,車牌識別
,靠近生活的有推薦系統
,使用者畫像
,情感分析
等等,都或多或少用到機器學習的知識。其中大部分應用是相當能滿足程式設計師心中的極客精神的
但令人頭不痛不已的當你去涉足機器學習
這個領域的時候,你會發現其中涉及大量的數學知識,這對很多程式設計師來說都很不友好。
但沒關係,程式設計師應該是工程師,而不是科學家,我們要做的是學會把理論落實成為生產力。
因此本系列將盡可能降低數學的描述(避免一長串的數學證明)來描述機器學習演算法的基本原理。如果需要對演算法進行深入瞭解和學習,那麼讀者還是應該學習演算法背後的數學原理。
好了,廢話不多說,馬上開講第一個機器學習的演算法,KNN演算法。
KNN演算法
演算法背景
假設,你是一個電影公司的影片分類員,你需要從一大堆影片裡面分類出武俠片和愛情片,用肉眼一部部看肯定不科學,現在有一個程式能識別影片中的鏡頭,聰明的你想到了又麼麼噠的場面的一定是愛情片,有廝打場面的就是武俠片。
其中,麼麼噠和廝打兩種場面則稱為特徵
你把這兩種特徵放入程式裡面一分類,咦,怎麼錯這麼多?!
然後,你決定開啟其中一兩個錯誤的結果看看……
咦,剛剛還刀劍相向的女主角怎麼怎麼和男主角吻了起來,臥槽,那可是你的殺父仇人啊喂,哦,原來男主角是被奸人所逼……
咦,這愛情片男女主角怎麼吻著吻著就廝打起來,臥槽,還要脫衣服,天啊,我還是個孩子……
你終於明白,錯誤的原因是因為無法將麼麼噠和廝打作為單一特徵,這時,你明白需要重設設計分類的標準了。
演算法設計
牛逼的你發現,雖然無法將麼麼噠和廝打作為唯一標準,但是是可以作為參考的。比如說,在武俠片中雖然也會出現麼麼噠的鏡頭,但顯然廝打鏡頭仍會佔主流。
於是你對以往已經分好類別的電影做出統計,並的做出以下表格。
其中這部分樣本又叫做訓練集
X=麼麼噠鏡頭的數量
Y=廝打鏡頭的數量
0代表愛情片,1代表武俠片
電影ID | X | Y | 型別 |
---|---|---|---|
1 | 10 | 2 | 0 |
2 | 8 | 3 | 0 |
3 | 2 | 6 | 1 |
…… | …… | …… | …… |
把它畫出二維圖大概是這樣:
黃點代表1類電影的分佈,綠色代表0類電影的分佈,紫色代表需要分類的電影樣本。
那麼該怎麼判別紫色的那顆點所在的類別呢?
沒錯,KNN就是最簡單粗暴的方法,首先判別紫色點離黃色群體和離綠色群體距離,然後將紫色判斷為距離最近的那個群體。
這裡具體指出利用KNN的具體步驟:
- 計算上述圖中所有點到達待測點的歐式距離(勾股定理計算)。
- 選出離待測點最近的
K
個點,k
由使用者指定。 - 計算在這
k
個點中,各個型別的個數 - 將個數最多的型別作為預測點的型別。
程式碼實現
KNN程式碼實現,收錄我的github上,點選一下連線並進入classify
目錄下就可訪問
後話
在我的github
中會慢慢更新TO DO LIST
裡提及的演算法,但文章因需要語言總結會稍慢一點。
另外,本文題目是機器學習從入門到放棄之KNN演算法而非機器學習從入門到放棄(1):KNN演算法這樣,因為如果是後者,某日我要棄坑就會觸發我的強迫症,而前者並不會,哈哈哈。
如有錯誤,歡迎指點。