【Machine learning】K-NN(k-nearest neighbor)

knn是一種常見的監督學習方法。

工作機制:給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的k個訓練樣本,然後基於這個k個“鄰居”的信息進行預測。

懶惰學習,訓練階段僅僅是把樣本保存起來,待收到樣本後再進行處理。

 

 

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-近鄰算法的另一個缺陷是它無法給出任何數據的基礎結構信息, 因此我們也無法知曉平均實例樣本和典型實例樣本具有什麼特徵

 

 

(數據驅動,從數據中學習規律。)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章