KNN演算法——分類部分

ssswy發表於2019-06-29

1.核心思想

如果一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。也就是說找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。

下面看一個例子,

  一個程式設計師面試結束後,想想知道是否拿到offer,他在網上找到幾個人的工作經歷和大概薪資,如下,X為年齡,Y為工資;

    

 

當k取1的時候,我們可以看出距離最近的no offer,因此得到目標點為不被錄用。

當k取3的時候,我們可以看出距離最近的三個,分別是有offer 和no offer,根據投票決定 offer的票數較高為2 ,所以被錄用。

 

演算法流程

1. 準備資料,對資料進行預處理,常用方法,特徵歸一化、類別型特徵的處理、高維組合特徵的處理、組合特徵的處理、文字表示模型的模型處理、Word2Vec、影象資料不足時的處理方法

    

2. 選用合適的資料結構儲存訓練資料和測試元組,根據模型驗證方法,把樣本劃分不同的訓練集和測試集,比如holdout只需要劃分為兩個部分,交叉驗證劃分為k個子集,自助法跟著模型來

3. 設定引數,如k的取值,這個涉及到超引數調優的問題,網路搜尋、隨機搜尋、貝葉斯演算法等

4.維護一個大小為k的的按距離由大到小的優先順序佇列,用於儲存最近鄰訓練元組。隨機從訓練元組中選取k個元組作為初始的最近鄰元組,分別計算測試元組到這k個元組的距離,將訓練元組標號和距離存入優先順序佇列

5. 遍歷訓練元組集,計算當前訓練元組與測試元組的距離,將所得距離L 與優先順序佇列中的最大距離Lmax

6. 進行比較。若L>=Lmax,則捨棄該元組,遍歷下一個元組。若L < Lmax,刪除優先順序佇列中最大距離的元組,將當前訓練元組存入優先順序佇列。

7. 遍歷完畢,計算優先順序佇列中k 個元組的多數類,並將其作為測試元組的類別。

8. 測試元組集測試完畢後計算誤差率,繼續設定不同的k值重新進行訓練,最後取誤差率最小的k 值。

 

簡單來說,knn演算法最重要的是三個要素:K值選擇,距離度量,分類決策規則,

 

K的選擇

  如k的取值,這個涉及到超引數調優的問題,k的取值對結果會有很大的影響。K值設定過小會降低分類精度,增加模型複雜度;若設定過大,且測試樣本屬於訓練集中包含資料較少的類,則會增加噪聲,降低分類效果。通常,K值的設定採用交叉檢驗的方式(以K=1,K=2,K=3依次進行),K折交叉驗證如下:

  

    1)  將全部訓練集S分成K個不相交的子集,假設S中的訓練樣例個數為m,那麼每一個子集有m/k個訓練樣例。

 

     (2)  每次從分好的子集中,選出一個作為測試集,另外k-1個作為訓練集。

 

     (3)  根據訓練集得到模型。

 

     (4)  根據模型對測試集進行測試,得到分類率。

 

     (5)  計算k次求得的分類率的平均值,作為模型的最終分類率。

以五折交叉驗證為例;

 

 

 

 

分別得出K=1時的平均分類準確度、K=1時的平均分類準確度……選出最優K值

 

 

 

距離度量

 

在KNN演算法中,常用的距離有三種,分別為曼哈頓距離、歐式距離和閔可夫斯基距離。

距離通式:

 

當p=1時,稱為曼哈頓距離

 

 

 

當p=2時,稱為歐式距離

 

 

 

當p=∞時,

 

 

 

 

分類決策規則

 1.多數表決:少數服從多數,即訓練集裡和預測的樣本特徵最近的K個樣本,預測為裡面有最多類別數的類別

 

 

2.加權表決:根據各個鄰居與測試物件距離的遠近來分配相應的投票權重。最簡單的就是取兩者距離之間的倒數,距離越小,越相似,權重越大,將權重累加,最後選擇累加值最高類別屬性作為該待測樣本點的類別,類似大眾評審和專家評審。

 

     這兩種確簡單直接,在樣本量少,樣本特徵少的時候有效,只適合資料量小的情況。因為我們經常碰到樣本的特徵數有上千以上,樣本量有幾十萬以上,如果我們這要去預測少量的測試集樣本,演算法的時間效率很成問題。因此,這個方法我們一般稱之為蠻力實現。比較適合於少量樣本的簡單模型的時候用。一個是KD樹實現,一個是球樹實現。

相關文章