1.核心思想程序員
若是一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具備這個類別上樣本的特性。也就是說找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就能夠獲得該樣本的屬性。面試
下面看一個例子,算法
一個程序員面試結束後,想一想知道是否拿到offer,他在網上找到幾我的的工做經歷和大概薪資,以下,X爲年齡,Y爲工資;網絡
當k取1的時候,咱們能夠看出距離最近的no offer,所以獲得目標點爲不被錄用。數據結構
當k取3的時候,咱們能夠看出距離最近的三個,分別是有offer 和no offer,根據投票決定 offer的票數較高爲2 ,因此被錄用。測試
算法流程對象
1. 準備數據,對數據進行預處理,經常使用方法,特徵歸一化、類別型特徵的處理、高維組合特徵的處理、組合特徵的處理、文本表示模型的模型處理、Word2Vec、圖像數據不足時的處理方法blog
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樹實現,一個是球樹實現。