机器学习算法总结--K近邻
參考文章:
- 《統計學習方法》
- 機器學習常見算法個人總結(面試用)
- 機器學習系列(9)_機器學習算法一覽(附Python和R代碼)
簡介
k近鄰(KNN)是一種基本分類與回歸方法。
其思路如下:給一個訓練數據集和一個新的實例,在訓練數據集中找出與這個新實例最近的k個訓練實例,然后統計最近的k個訓練實例中所屬類別計數最多的那個類,就是新實例的類。其流程如下所示:
KNN的特殊情況是k=1的情況,稱為最近鄰算法。對輸入的實例點(特征向量)x,最近鄰法將訓練數據集中與x最近鄰點的類作為其類別。
三要素
k值的選擇
所以一般k會取一個較小的值,然后用過交叉驗證來確定
這里所謂的交叉驗證就是將樣本劃分一部分出來為預測樣本,比如95%訓練,5%預測,然后k分別取1,2,3,4,5之類的,進行預測,計算最后的分類誤差,選擇誤差最小的k
距離的度量
KNN算法使用的距離一般是歐式距離,也可以是更一般的Lp距離或者馬氏距離,其中Lp距離定義如下:
這里xi=(x(1)i,x(2)i,...x(n)i)T,xj=(x(1)j,x(2)j,...,x(n)j)T,然后p≥1。
當p=2,稱為歐式距離,即
當p=1,稱為曼哈頓距離,即
L1(xi,xj)=∑l=1n|x(l)i?x(l)j|
當p=∞,它是各個坐標距離的最大值,即
L∞(xi,xj)=maxl|x(l)i?x(l)j|
馬氏距離如下定義:
KNN的回歸
在找到最近的k個實例之后,可以計算這k個實例的平均值作為預測值。或者還可以給這k個實例添加一個權重再求平均值,這個權重與度量距離成反比(越近權重越大)。
優缺點
優點
- 準確度高,對數據沒有假設,對異常值不敏感;
缺點
- 計算量大;
- 樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少);
- 需要大量的內存;
- 首先構造根節點,以坐標a1的中位數b為切分點,將根結點對應的矩形局域劃分為兩個區域,區域1中a1<b,區域2中a1>b
- 構造葉子節點,分別以上面兩個區域中a2的中位數作為切分點,再次將他們兩兩劃分,作為深度1的葉子節點,(如果中位數a2=中位數,則a2的實例落在切分面)
- 不斷重復2的操作,深度為j的葉子節點劃分的時候,索取的ai 的i=j,直到兩個子區域沒有實例時停止
- 首先從根節點開始遞歸往下找到包含x的葉子節點,每一層都是找對應的xi
- 將這個葉子節點認為是當前的“近似最近點”
- 遞歸向上回退,如果以x圓心,以“近似最近點”為半徑的球與根節點的另一半子區域邊界相交,則說明另一半子區域中存在與x更近的點,則進入另一個子區域中查找該點并且更新”近似最近點“
- 重復3的步驟,直到另一子區域與球體不相交或者退回根節點
- 最后更新的”近似最近點“與x真正的最近點
- KNN的計算成本很高
- 所有特征應該標準化數量級,否則數量級大的特征在計算距離上會有偏移。
- 在進行KNN前預處理數據,例如去除異常值,噪音等。
KD樹
KD樹是一個二叉樹,表示對K維空間的一個劃分,可以進行快速檢索(那KNN計算的時候不需要對全樣本進行距離的計算了)
構造KD樹
在k維的空間上循環找子區域的中位數進行劃分的過程。
假設現在有K維空間的數據集T=x1,x2,x3,…xn,xi=a1,a2,a3..ak
KD樹的搜索
KD樹進行KNN查找
通過KD樹的搜索找到與搜索目標最近的點,這樣KNN的搜索就可以被限制在空間的局部區域上了,可以大大增加效率。
KD樹搜索的復雜度
當實例隨機分布的時候,搜索的復雜度為log(N),N<script type="math/tex" id="MathJax-Element-47">N</script>為實例的個數,KD樹更加適用于實例數量遠大于空間維度的KNN搜索,如果實例的空間維度與實例個數差不多時,它的效率基于等于線性掃描。
代碼實現
使用sklearn的簡單代碼例子:
#Import Library from sklearn.neighbors import KNeighborsClassifier#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create KNeighbors classifier object model KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5# Train the model using the training sets and check score model.fit(X, y)#Predict Output predicted= model.predict(x_test)最后,在用KNN前你需要考慮到:
總結
以上是生活随笔為你收集整理的机器学习算法总结--K近邻的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超级全面的权限系统设计方案
- 下一篇: Virtualbox安装Debian 安