1. 程式人生 > >機器學習筆記之八—— knn-最簡單的機器學習演算法以及KD樹原理

機器學習筆記之八—— knn-最簡單的機器學習演算法以及KD樹原理

上一節結束了線性迴歸、邏輯迴歸,今天一節來介紹機器學習中最簡單的演算法:  

 K近鄰(KNN,全稱K-nearst Neighbor)

      概述:判斷一個樣本的label只需要判斷該樣本週圍其他樣本的label。簡言之,朋友選啥我選啥。

      具體實現

          對於特徵為X(X可以是多個),樣本為y的訓練集,當我們需要預測的時候,直接將需要預測的目標樣本yi拿過來,在訓練集中遍歷,尋找與目標樣本yi的特徵Xi距離相近的點(距離相近的意思可以是歐幾裡的距離,也可以是其他,距離的大小由我們人為規定

)。

         找到我們距離相近的點(可能是多個,這個點要多少由我們認為規定。這些點被稱為近鄰點)之後:

         如果是分類問題,那麼就對這些點的label進行投票法(就是選數量最多的那個類別)或者加權投票法(把距離的倒數作為權值,加權求和)。

         如果是迴歸問題,就對這些點的label求平均值,或者加權平均值作為目標樣本的結果。

       調參(需要我們給定的引數)

         (1)、K值,即判斷樣本需要幾個近鄰點。過大容易欠擬合,過小容易過擬合。

        (2)、距離的度量:一般使用歐幾裡的距離。

        (3)、決策規則:使用投票法、平均法,還是加權投票法、加權平均法。

KD樹

  按照上面的思路,在訓練集中遍歷尋找近鄰點的方法叫做暴力搜尋,顯然這種暴力搜尋的開銷是極其巨大的,每一次預測都要遍歷整個訓練集,在資料集較大的時候我們採用另一種方法來尋找近鄰點,那就是KD樹。

  構建KD樹:

      對於具有兩個特徵值X1和X2的樣本,計算樣本中兩個特徵的方差,對方差大的特徵取中位數,將中位數作為根結點的判斷條件,小於中位數的放在左子樹,大於中位數的放在右子樹。

      對左、右子樹進行同樣的操作,如:在左子樹的樣本中,計算兩個特徵的方差,對方差大的特徵取中位數,將中位數作為根結點的判斷條件……

    如此迴圈,直到樣本點分完,KD樹構建完成。

   以上是對於兩個特徵,N個特徵的時候也是一樣的。

 

  如何預測?

     第一步,在KD樹中找到包含目標點的葉子節點。

     第二步,以目標點為圓心,以目標點到這個葉子節點的的距離為半徑,畫圖,最近鄰點一定在這個圓裡面。(對於對於多個特徵,這裡就是超球體了)。

      第三步,找到這個葉子節點的父節點A,檢查該父節點A的另一子樹的所有結點構成的超矩形體是否和超球體有相交(就是另一子樹的結點是否有結點落在這個圓、超球體裡面,相交就可能有),若相交,遍歷此節點下是否有更加近的近鄰點,有就更新。

     第四步,若沒有,就返回第三步中說的的父節點A的父節點B,對B進行第三步中的操作,檢查是否有相交,是否有更近的近鄰點。

  下圖為一個二維特徵的KD樹預測過程,x,y軸分別為兩個特徵屬性。