【基礎不牢,地動山搖】K近鄰算法--KNN

什麼是K近鄰算法?

K近鄰是最爲基礎的分類和迴歸算法!他的基本原則就是:對給定的訓練實例點和輸入實例點,首先確定輸入實例點的kk個最近鄰訓練實例點,然後利用這kk個訓練實例點的類的多數來預測輸入實例點的類。簡單的說就是近朱者赤,近墨者黑。該點周圍的K個點絕大部分是紅色的,那麼它是紅色的概率也大。如果絕大部分是黑色的,那麼它也極有可能是黑色的!
在這裏插入圖片描述

KK近鄰三要素

kk近鄰法三要素有:

  • 距離度量
    距離度量:就是用何種方式選擇KK個點:一般的方法就是用歐式距離

  • kk值的選擇
    KK的選擇一般是採用交叉驗證來選擇,它的選擇反映出了近似誤差與估計誤差之間的權衡。

  • 分類決策規則
    分類決策通常爲多數表決,對應於經驗風險最小化。也就是少數服從多數。

key point

kk近鄰法的實現需要考慮如何快速搜索k個最近鄰點。對於一維變量來說,二叉樹是一個不錯的先擇。對於K維空間則使用kd樹(上一篇博客進行過介紹

距離度量

設特徵空間xxnn維實數向量空間 ,xi,xjXx_{i}, x_{j} \in \mathcal{X},xi=(xi(1),xi(2), ,xi(n))Tx_{i}=\left(x_{i}^{(1)}, x_{i}^{(2)}, \cdots, x_{i}^{(n)}\right)^{\mathrm{T}},xj=(xj(1),xj(2), ,xj(n))Tx_{j}=\left(x_{j}^{(1)}, x_{j}^{(2)}, \cdots, x_{j}^{(n)}\right)^{\mathrm{T}} ,則:xix_i,xjx_jLpL_p距離定義爲:

Lp(xi,xj)=(i=1nxi(i)xj(l)p)1pL_{p}\left(x_{i}, x_{j}\right)=\left(\sum_{i=1}^{n}\left|x_{i}^{(i)}-x_{j}^{(l)}\right|^{p}\right)^{\frac{1}{p}}

p=1p= 1 曼哈頓距離
p=2p= 2 歐氏距離
p=infp= inf 閔式距離

python實現距離度量

import math
from itertools import combinations
def L(x, y, p=2):
    # x1 = [1, 1], x2 = [5,1]
    if len(x) == len(y) and len(x) > 1:
        sum = 0
        for i in range(len(x)):
            sum += math.pow(abs(x[i] - y[i]), p)
        return math.pow(sum, 1 / p)
    else:
        return 0

scikit-learning 種的knn

from sklearn.neighbors import KNeighborsClassifier
clf_sk = KNeighborsClassifier()
clf_sk.fit(X_train, y_train)
clf_sk.score(X_test, y_test)

整體的流程

  • 劃分好訓練集,測試集
  • 設置好距離度量方法
  • 選擇出測試點距離最近的K個點
  • 對這K個點的標籤進行投票
  • 獲得最終的決策
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章