knn是一種基本的分類(由與該樣本最近的k個樣本進行投票表決)與回歸方法(回歸問題:可以將乙個樣本的k個近鄰的平均屬性或者加權平均屬性賦予該樣本)。k值的選擇,距離度量以及分類決策規則是knn的三個基本要素。knn2023年由cover和hart提出。
1.1閔可夫斯基距離
閔可夫斯基距離不是距離,是一組距離的定義。 lp
(xi,
yi)=
(∑nl
=1∣∣
xli−
xlj∣
∣p)1
p 1.2當p=
2 時,稱為歐式距離,即有:lp
(xi,
yi)=
(∑nl
=1∣∣
xli−
xlj∣
∣2)1
2 1.3當p=
1 時,稱為曼哈頓距離,即有:lp
(xi,
yi)=
∑nl=
1∣∣x
li−x
lj∣∣
1.4當p=
∞ 時,稱為切比雪夫距離,即有:lp
(xi,
yi)=
maxl
=1∣∣
xli−
xlj∣
∣ 1.5夾角余弦co
s(θ)
=xi∗
xj|x
i|∗|
xj|
1.6漢明距離
兩個特徵向量之間的漢明距離定義為將其中乙個變為另外乙個所需要作的最小替換次數。例如特徵向量「1111」與「1001」之間的漢明距離為2。應用:資訊編碼(為了增強容錯性,應使得編碼間的最小漢明距離盡可能大)
k值較小的時候,只有與測試樣本較近的訓練例項才會對**結果起作用,但是缺點是泛化能力較差,因為如果離測試樣本最近的訓練例項剛好是雜訊,**就會出錯。換句話說,k值得減小意味著整體模型變得複雜,容易發生過擬合。
k值較大的時候,比如k=n(訓練樣本總數),這種模型就過於簡單,無論來了什麼樣本都將其**為訓練樣本中最多的類別。這種模型忽略了訓練例項中大量有用的資訊。
在實際應用中,k的取值一般較小,然後是通過交叉驗證的方法來確定最優k值。
一般用投票的機理決定樣本的類別,而多數表決等價於經驗風險最小化。
knn最簡單的實現就是線性掃面,假若存在n個樣本,那麼時間複雜度就是o(
n),利用kd樹可以使得時間複雜度為o(
logn
)
演算法:構建k-d樹(createkdtree)
輸入:資料點集data-set和其所在的空間range(感覺這個range應該就是split域的值)
輸出:kd,型別為k-d tree
1.if data-set為空,則返回空的k-d tree
2.呼叫節點生成程式:
(1)確定split域:對於所有描述子資料(特徵向量),統計它們在每個維上的資料方差。假設每條資料記錄為64維,可計算64個方差。挑選出最大值,對應的維就是split域的值。資料方差大表明沿該座標軸方向上的資料分散得比較開,在這個方向上進行資料分割有較好的解析度;
(2)確定node-data域:資料點集data-set按其第split域的值排序。位於正中間的那個資料點被選為node-data。此時新的data-set
' = data-set \ node-data(除去其中node-data這一點)。
3.dataleft =
left_range =
dataright =
right_range =
4.left = 由(dataleft,left_range)建立的k-d tree,即遞迴呼叫createkdtree(dataleft,left_range)。並設定left的parent域為kd;
right = 由(dataright,right_range)建立的k-d tree,即呼叫createkdtree(dataleft,left_range)。並設定right的parent域為kd。
如果想詳細了解knn以及相關拓展可以參考該文。 統計學習 k NN篇
k 近鄰法是一種基本的分類與回歸方法,其三個基本要素是k值的選擇 距離度量 分類決策規則,乙個實現方法是kd樹。它的基本思想是給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。當k 1 時為特殊情況,稱為最近鄰演算法...
統計學習方法筆記 KNN
k近鄰法 k nearest neighbor,k nn 這裡只討論基於knn的分類問題,1968年由cover和hart提出,屬於判別模型 k近鄰法不具有顯式的學習過程,演算法比較簡單,每次分類都是根據訓練集中k個最近鄰,通過多數表決的方式進行 所以模型需要保留所有訓練集資料,而象感知機這樣的模型...
統計學習方法筆記 KNN
k近鄰法 k nearest neighbor,k nn 這裡只討論基於knn的分類問題,1968年由cover和hart提出,屬於判別模型 k近鄰法不具有顯式的學習過程,演算法比較簡單,每次分類都是根據訓練集中k個最近鄰,通過多數表決的方式進行 所以模型需要保留所有訓練集資料,而象感知機這樣的模型...