K最近邻分类器
轉自:?http://www.cnblogs.com/qwertWZ/p/4582096.html
本章介紹了《機器學習實戰》這本書中的第一個機器學習算法:k-近鄰算法,它非常有效而且易于掌握。首先,我們將探討k-近鄰算法的基本理論,以及如何使用距離測量的方法分類物品;其次我們將使用Python從文本文件中導入并解析數據;再次,本文討論了當存在許多數據來源時,如何避免計算距離時可能碰到的一些常見錯誤;最后,利用實際的例子講解如何使用k-近鄰算法改進約會網站和手寫數字識別系統。
回到頂部1. k-近鄰算法概述
簡單地說,k-近鄰算法采用測量不同特征值之間的距離方法進行分類。
k-近鄰算法
優點:精度高、對異常值不敏感、無數據輸入假定。
缺點:計算復雜度高、空間復雜度高
適用數據范圍:數值型和標稱型
k-近鄰算法(kNN)的工作原理是:存在一個樣本數據集合,也稱作訓練樣本集,并且樣本集中每個數據都存在標簽,即我們知道樣本集中每一數據與所屬分類的對應關系。輸入沒有標簽的新數據后,將新數據的每個特征與樣本集中數據對應的特征進行比較,然后算法提取樣本集中特征最相似數據(最近鄰)的分類標簽。一般來說,我們只選擇樣本數據集中前k個最相似的數據,這就是k-近鄰算法中k的出處,通常k是不大于20的整數。最后,選擇k個最相似數據中出現次數最多的分類,作為新數據的分類。
現在我們回到前面電影分類的例子,使用k-近鄰算法分類愛情片和動作片。有人曾經統計過很多電影的打斗鏡頭和接吻鏡頭,圖1顯示了6部電影的打斗和接吻鏡頭數。假如有一部未看過的電影,如何確定它是愛情片還是動作片呢?我們可以使用kNN來解決這個問題。
?
圖1 使用打斗和接吻鏡頭數分類電影
首先我們需要知道這個未知電影存在多少個打斗鏡頭和接吻鏡頭,圖1中問號位置是該未知電影出現的鏡頭數圖形化展示,具體數字參見下表。
表1 每部電影的打斗鏡頭數、接吻鏡頭數以及電影評估類型
| 電影名稱 | 打斗鏡頭 | 接吻鏡頭 | 電影類型 |
| California Man | 3 | 104 | 愛情片 |
| He’s Not Really into Dudes | 2 | 100 | 愛情片 |
| Beautiful Woman | 1 | 81 | 愛情片 |
| Kevin Longblade | 101 | 10 | 動作片 |
| Robo Slayer 3000 | 99 | 5 | 動作片 |
| Amped II | 98 | 2 | 動作片 |
| ? | 18 | 90 | 未知 |
計算未知電影與樣本集中其他電影的距離,我們可以比較其相似度:
表2 已知電影與未知電影的距離
| 電影名稱 | 與未知電影的距離 |
| California Man | 20.5 |
| He’s Not Really into Dudes | 18.7 |
| Beautiful Woman | 19.2 |
| Kevin Longblade | 115.3 |
| Robo Slayer 3000 | 117.4 |
| Amped II | 118.9 |
現在我們得到了樣本集中所有電影與未知電影的距離,按照距離遞增排序,可以找到k個距離最近的電影。假定k=3,則三個最靠近的電影依次是He’s Not Really into Dudes、Beautiful Woman和California Man。k-近鄰算法按照距離最近的三部電影的類型,決定未知電影的類型,而這三部電影全是愛情片,因此我們判定未知電影是愛情片。
k-近鄰算法的一般流程
收集數據:可以使用任何方法。?
準備數據:距離計算所需要的數值,最好是結構化的數據格式。?
分析數據:可以使用任何方法。?
測試算法:計算錯誤率。?
使用算法:首先需要輸入樣本數據和結構化的輸出結果,然后運行k-近鄰算法判定輸入數據分別屬于哪個分類。
1.1 準備:使用Python導入數據
創建名為kNN.py的Python模塊,在kNN.py文件中增加下面的代碼:
| 1 2 3 4 5 6 7 | from?numpy import * import operator ? def createDataSet(): ????group?= array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) ????labels = ['A', 'A', 'B', 'B'] ????return?group, labels |
這個函數創建了我們將要使用的樣例數據集。
在Python shell中輸入下列命令測試上面的函數:
| 1 2 | >>> import kNN >>> group, labels = kNN.createDataSet() |
1.2 實施kNN算法
k-近鄰算法的偽代碼
對未知類型屬性的數據集中的每個點依次執行以下操作:
(1) 計算已知類別數據集中的點與當前點之間的距離;
(2) 按照距離增序排序;
(3) 選取與當前點距離最近的k個點;
(4) 決定這k個點所屬類別的出現頻率;
(5) 返回前k個點出現頻率最高的類別作為當前點的預測分類。
函數實現如下:
總結
- 上一篇: 徐梦桃个人资料介绍(冬奥冠军徐梦桃的人生
- 下一篇: 为什么jdk的CLASSPATH环境变量