机器学习-KNN
一、概述
1.基本工作原理:存在一個帶有標簽的樣本集,即我們知道樣本中的每個數據與所屬分類的對應關系。輸入沒有標簽的數據,將新數據的每個特征與樣本中數據的對應特征進行比較,算法提取最相似樣本的分來標簽。選擇樣本數據集中前k個最相似的數據,這就是k-近鄰算法中k的出處,通常k是不大于20的整數。最后,選擇k個最相似數據中出現次數最多的分類,作為新數據的分類。
例如上表訓練樣本集。這個數據集有兩個特征,即打斗鏡頭數和接吻鏡頭數。分類標簽為愛情片和動作片。大致可以觀察發現接吻鏡頭多的是愛情片,打斗鏡頭多的是動作片。而k-近鄰算法可以做到,你告訴它這個電影打斗鏡頭數為2,接吻鏡頭數為102,它會依據數據經驗告訴你這個是愛情片。但是依據樣本數據集k-近鄰算法的眼里,電影類型只有愛情片和動作片,它會提取樣本集中特征最相似數據(最鄰近)的分類標簽,得到的結果可能是愛情片,也可能是動作片,但絕不會是"愛情動作片"。當然,這些取決于數據集的大小以及最近鄰的判斷標準等因素。
2.距離計算
我們可以從散點圖大致推斷,這個紅色圓點標記的電影可能屬于動作片,因為距離已知的那兩個動作片的圓點更近。k-近鄰算法用什么方法進行判斷呢?沒錯,就是距離度量。這個電影分類的例子有2個特征,也就是在2維實數向量空間,可以使用我們高中學過的兩點距離公式計算距離,即
?
通過計算,我們可以得到如下結果:
- 新數據(101,20)距離動作片(108,5)的距離約為16.55
- 新數據(101,20)距離動作片(115,8)的距離約為18.44
- 新數據(101,20)距離愛情片(5,89)的距離約為118.22
- 新數據(101,20)距離愛情片(1,101)的距離約為128.69
通過計算可知,紅色圓點標記的電影到動作片 (108,5)的距離最近,為16.55。如果算法直接根據這個結果,判斷該紅色圓點標記的電影為動作片,這個算法就是最近鄰算法,而非k-近鄰算法。
k-近鄰算法步驟如下:
比如,現在我這個k值取3,那么在電影例子中,按距離依次排序的三個點分別是動作片(108,5)、動作片(115,8)、愛情片(5,89)。在這三個點中,動作片出現的頻率為三分之二,愛情片出現的頻率為三分之一,所以該紅色圓點標記的電影為動作片。這個判別過程就是k-近鄰算法。
但是,電影例子中的特征是2維的,這樣的距離度量可以用兩點距離公式計算,但是如果是更高維的呢?我們可以用歐氏距離(也稱歐幾里德度量),我們高中所學的兩點距離公式就是歐氏距離在二維空間上的公式,也就是歐氏距離的n的值為2的情況。
?應該還有其他計算距離的方法,待補充.....切比雪夫距離、馬氏距離 巴氏距離等
?
二、算法
k-近鄰算法
三、使用
上面學習了簡單的k-近鄰算法的實現方法,但是這并不是完整的k-近鄰算法流程,k-近鄰算法的一般流程:
1.收集數據:可以使用爬蟲進行數據的收集,也可以使用第三方提供的免費或收費的數據。一般來講,數據放在txt文本文件中,按照一定的格式進行存儲,便于解析及處理。
2.準備數據:使用Python解析、預處理數據。
3.分析數據:可以使用很多方法對數據進行分析,例如使用Matplotlib將數據可視化。
4.測試算法:計算錯誤率。
5.使用算法:錯誤率在可接受范圍內,就可以運行k-近鄰算法進行分類。
6.代碼實現:待補充
四、參數
KNeighborsClassifier(n_neighbors=5,?weights=’uniform’,?algorithm=’auto’,?leaf_size=30,?p=2,?metric=’minkowski’,?metric_params=None,?n_jobs=None,?**kwargs)
KNneighborsClassifier參數說明:
- n_neighbors:默認為5,就是k-NN的k的值,選取最近的k個點。
- weights:默認是uniform,參數可以是uniform、distance,也可以是用戶自己定義的函數。uniform是均等的權重,就說所有的鄰近點的權重都是相等的。distance是不均等的權重,距離近的點比距離遠的點的影響大。用戶自定義的函數,接收距離的數組,返回一組維數相同的權重。
- algorithm:快速k近鄰搜索算法,默認參數為auto,可以理解為算法自己決定合適的搜索算法。除此之外,用戶也可以自己指定搜索算法ball_tree、kd_tree、brute方法進行搜索,brute是蠻力搜索,也就是線性掃描,當訓練集很大時,計算非常耗時。kd_tree,構造kd樹存儲數據以便對其進行快速檢索的樹形數據結構,kd樹也就是數據結構中的二叉樹,關于algorithm參數kd_tree的原理,可以查看《統計學方法 李航》書中的講解。以中值切分構造的樹,每個結點是一個超矩形,在維數小于20時效率高。ball tree是為了克服kd樹高緯失效而發明的,其構造過程是以質心C和半徑r分割樣本空間,每個節點是一個超球體。
- leaf_size:默認是30,這個是構造的kd樹和ball樹的大小。這個值的設置會影響樹構建的速度和搜索速度,同樣也影響著存儲樹所需的內存大小。需要根據問題的性質選擇最優的大小。
- metric:用于距離度量,默認度量是minkowski,也就是p=2的歐氏距離(歐幾里德度量)。
- p:距離度量公式。在上小結,我們使用歐氏距離公式進行距離度量。除此之外,還有其他的度量方法,例如曼哈頓距離。這個參數默認為2,也就是默認使用歐式距離公式進行距離度量。也可以設置為1,使用曼哈頓距離公式進行距離度量。
- metric_params:距離公式的其他關鍵參數,這個可以不管,使用默認的None即可。
- n_jobs:并行處理設置。默認為1,臨近點搜索并行工作數。如果為-1,那么CPU的所有cores都用于并行工作。
五、特別之處
優點
- 簡單好用,容易理解,精度高,理論成熟,既可以用來做分類也可以用來做回歸;
- 可用于數值型數據和離散型數據;
- 訓練時間復雜度為O(n);無數據輸入假定;
- 對異常值不敏感
缺點
- 計算復雜性高;空間復雜性高;
- 樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少);
- 一般數值很大的時候不用這個,計算量太大。但是單個樣本又不能太少,否則容易發生誤分。
- 最大的缺點是無法給出數據的內在含義。
參考資料:
1.機器學習實戰教程(一):K-近鄰算法(史詩級干貨長文) | Jack Cui
2.《機器學習實戰》。
3.《統計學習方法 李航》。
轉載于:https://www.cnblogs.com/2019-02-11/p/10597131.html
總結
- 上一篇: Selenium+python --获取
- 下一篇: 【Qt开发】常用控件--QLineEdi