1.k近鄰法是基本且簡單的分類與回歸方法。k近鄰法的基本做法是:對給定的訓練例項點和輸入例項點,首先確定輸入例項點的k個最近鄰訓練例項點,然後利用這個訓練例項點的類的多數來**輸入例項點的類。
2.k近鄰模型對應於基於訓練資料集對特徵空間的乙個劃分。k近鄰法中,當訓練集、距離度量、k值及分類決策規則確定後,其結果唯一確定。
3.k近鄰法三要素:距離度量、k值的選擇和分類決策規則。常用的距離度量是歐氏距離及更一般的pl距離。k值小時,近鄰模型更複雜;k值大時,近鄰模型更簡單。k值的選擇反映了對近似誤差與估計誤差之間的權衡,通常由交叉驗證選擇最優的。
常用的分類決策規則是多數表決,對應於經驗風險最小化。
4.k近鄰法的實現需要考慮如何快速搜尋 k 個最近鄰點。kd樹是一種便於對 k 維空間中的資料進行快速檢索的資料結構。kd 樹是二叉樹,表示對維空間的乙個劃分,其每個結點對應於維空間劃分中的乙個超矩形區域。利用kd樹可以省去對大部分資料點的搜尋, 從而減少搜尋的計算量。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris(
)#載入資料集
df = pd.dataframe(iris.data, columns=iris.feature_names)
df['label'
]= iris.target
data = df.iloc[
:100,:
2].values
target = df.loc[:99
,'label'
].values#如果使用:100會取到100,獲得長度101的label,有點奇怪
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=
0.2)
class
knn:
def__init__
(self, n:
int, p:
int, x_train, y_train)
:"""
n:鄰居個數
p:距離度量範數
x_train:訓練資料
y_train:訓練標籤
"""self.n = n
self.p = p
self.x_train = x_train
self.y_train = y_train
defpredict
(self, point)
: dist = np.linalg.norm(point.reshape(1,
2)- self.x_train,
ord=self.p, axis=1)
neighbors = self.y_train[np.argsort(dist)
[:self.n]
]return np.argmax(np.bincount(neighbors)
)#返回出現次數最多的元素
首先看一下kd樹的劃分過程:乙個三維k-d樹。第一次劃分(紅色)把根節點(白色)劃分成兩個節點,然後它們分別再次被劃分(綠色)為兩個子節點。最後這四個子節點的每乙個都被劃分(藍色)為兩個子節點。因為沒有更進一步的劃分,最後得到的八個節點稱為葉子節點。(摘自wiki百科)
上圖的分割方法就是kd樹最經典的生成方法:
統計學習方法 k近鄰法
k近鄰法 knn 是一種基本的分類與回歸方法 分類這種需求,滲透到我們生活的方方面面 分類演算法可以幫助我們完成這些繁瑣的操作,並根據我們的要求不斷修正分類結果。分類演算法其實蠻多的,這裡順著書本順序,詳細講解knn演算法,再與k means k means 演算法進行簡單對比。k近鄰法是這樣乙個過...
統計學習方法 K近鄰法
k近鄰演算法簡單 直觀給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類.下面先敘述k近鄰演算法,然後再討論其細節。近鄰法的特殊情況 k 1情形,稱為最近鄰演算法.對於輸入的例項點 特徵向量 x xx,最近鄰法將訓練資...
統計學習方法 k 近鄰演算法
所謂k 近鄰 knn 是基本且簡單的分類與回歸方法,說的就是每個樣本的分類都可以用它最接近的k個鄰居來代表。1 對給定的訓練例項點和輸入例項點,首先確定輸入例項點的k個最近鄰訓練例項點,然後利用這k個訓練例項點的類的多數來 輸入例項點的類。2 k近鄰模型對應於基於訓練資料集對特徵空間的乙個劃分。k近...