1. 程式人生 > >【轉載】K-NN算法 學習總結

【轉載】K-NN算法 學習總結

數值 最簡 點距 情況 得到 tar cal 解決 定義域

1. K-NN算法簡介

 K-NN算法 ( K Nearest Neighbor, K近鄰算法 ), 是機器學習中的一個經典算法, 比較簡單且容易理解. K-NN算法通過計算新數據與訓練數據特征值之間的距離, 然後選取 K (K>=1) 個距離最近的鄰居進行分類或者回歸. 如果K = 1 , 那麽新數據將被分配給其近鄰的類.

  K-NN算法是一種有監督學習, K-NN算法用於分類時, 每個訓練數據都有明確的label, 也可以明確的判斷出新數據的label, K-NN用於回歸時也會根據鄰居的值預測出一個明確的值.

2. K-NN算法的過程

  1. 選擇一種距離計算方式, 通過數據所有的特征計算新數據與已知類別數據集中數據點的距離;
  2. 按照距離遞增次序進行排序, 選取與當前距離最小的 k 個點;
  3. 對於離散分類, 返回 k 個點出現頻率最多的類別作為預測分類; 對於回歸, 返回 k 個點的加權值作為預測值.

3. K-NN算法的關鍵

  K-NN 算法的理論和過程都很簡單, 但有幾個關鍵點需要特別註意.

3.1 數據特征的量化

  如果數據特征中存在非數值型的特征, 則需要采取手段將其量化為數值. 舉個例子,若樣本特征中包含顏色(紅黑藍)特征, 由於顏色之間沒有距離可言, 所以可以通過將顏色轉換為灰度值來實現距離計算. 另外, 一般樣本有多個參數, 每個參數都有自己的定義域和取值範圍, 因而它們對距離計算的影響也就不一樣. 比如取值範圍較大的參數影響力會蓋過取值較小的參數. 所以, 為了公平起見, 樣本參數必須做一些scale處理, 最簡單的方式就是將所有特征的數值都采取歸一化處理.

3.2 計算距離的方法

  距離的定義有很多種, 如歐氏距離, 余弦距離, 漢明距離, 曼哈頓距離等. 通常情況下,對於連續變量, 選取歐氏距離作為距離度量; 對於文本分類這種非連續變量, 選取漢明距離來作為度量. 通常如果運用一些特殊的算法來作為計算度量, 可以顯著提高 K 近鄰算法的分類精度, 如運用大邊緣最近鄰法或者近鄰成分分析法.

3.3 確定 K 值

  K是一個自定義的常數, 它的值會直接影響最後的預測結果. 一種選擇K值的方法是, 使用 cross-validate(交叉驗證)誤差統計選擇法. 交叉驗證就是把數據樣本的一部分作為訓練樣本, 另一部分作為測試樣本. 比如選擇95%作為訓練樣本, 剩下的用作測試樣本, 通過訓練數據集訓練出一個機器學習模型, 然後利用測試數據測試其誤差率. cross-validate(交叉驗證)誤差統計選擇法就是比較不同K值時的交叉驗證平均誤差率, 選擇誤差率最小的那個K值. 例如選擇K=1, 2, 3, ... , 對每個K = i 做100次交叉驗證, 計算出平均誤差, 通過比較選出誤差最小的那個.

4. K-NN分類與K-NN回歸

4.1 K-NN分類

  如果訓練樣本是多維特征空間向量, 其中每個訓練樣本都有一個類別標簽(喜歡或者不喜歡、保留或者刪除). 分類算法常采用 " 多數表決 " 決定, 即k個鄰居中出現次數最多的那個類作為預測類. “ 多數表決 ” 分類的一個缺點是出現頻率較多的樣本將會主導測試點的預測結果, 因為它們出現在測試點的K鄰域的幾率較大, 而測試點的屬性又是通過K領域內的樣本計算出來的. 解決這個缺點的方法之一是在進行分類時將K個鄰居到測試點的距離考慮進去. 例如, 樣本到測試點距離為d, 則選1/d為該鄰居的權重(也就是得到了該鄰居所屬類的權重), 然後統計出k個鄰居所有類標簽的權重和, 值最大的那個就是新數據點的預測類標簽。
  舉例,K=5, 計算出新數據點到最近的五個鄰居的舉例是(1, 3, 3, 4, 5), 五個鄰居的類標簽是(yes, no, no, yes, no). 如果按照多數表決法, 則新數據點類別為no(3個no, 2個yes); 若考慮距離權重, 則類別為yes(no:2/3+1/5, yes:1+1/4).

4.2 K-NN回歸

  數據點的類別標簽是連續值時應用K-NN算法就是回歸, 與K-NN分類算法過程相同, 區別在於對K個鄰居的處理上. K-NN回歸是取K個鄰居類標簽值得加權作為新數據點的預測值. 加權方法有: K個近鄰的屬性值的平均值(最差), 1/d為權重(有效的衡量鄰居的權重, 使較近鄰居的權重比較遠鄰居的權重大), 高斯函數(或者其他適當的減函數).

5. 總結

  K-近鄰算法是分類數據最簡單最有效的算法, 其學習基於實例, 使用算法時我們必須有接近實際數據的訓練樣本數據. K-近鄰算法必須保存全部數據集, 如果訓練數據集的很大, 則會占用大量的存儲空間. 此外, 由於必須對數據集中的每個數據計算距離值, 實際使用時可能非常耗時. k-近鄰算法的另一個缺陷是它無法給出任何數據的基礎結構信息, 因此我們也無法知曉平均實例樣本和典型實例樣本具有什麽特征.

參考資料:

K近鄰(KNN)算法: http://blog.csdn.net/suipingsp/article/details/41964713

K Nearest Neighbor 算法: http://coolshell.cn/articles/8052.html

作者:會心一擊 出處:http://www.cnblogs.com/lijingchn/

【轉載】K-NN算法 學習總結