KNN演算法原理與python實現

2021-10-23 08:22:46 字數 3849 閱讀 2951

knn演算法python實現

參考文獻

knn(k-nearest neighbor)演算法,顧名思義,其原理也就是「近朱者赤,近墨者黑」。knn演算法是一種有監督的分類演算法,輸入同樣為樣本特徵值向量以及對應的類標籤,輸出則為具有分類功能的模型,能夠根據輸入的特徵值**分類結果。核心原理就是,與待分類點最近的k個鄰居中,屬於哪個類別的多,待分類點就屬於那個類別。

knn分類演算法的思路很簡潔,實現也很簡潔,具體分三步:

1)找k個最近鄰。knn分類演算法的核心就是找最近的k個點,選定度量距離的方法之後,以待分類樣本點為中心,分別測量它到其他點的距離,找出其中的距離最近的「top k」,這就是k個最近鄰。

2)統計最近鄰的類別佔比。確定了最近鄰之後,統計出每種類別在最近鄰中的佔比。

3)選取佔比最多的類別作為待分類樣本的類別。

knn演算法模型主要有三要素構成:距離度量,k值的選擇和分類的決策規則。

距離度量

兩個樣本點之間的距離代表了這兩個樣本之間的相似度。距離越大,差異性越大;距離越小,相似度越大。

閔可夫斯基距離的數學表示式如下:

閔可夫斯基距離是一組距離的定義,不妨把閔可夫斯基距離看作乙個代數形式的母版,通過給p設定不同的值,就能用閔可夫斯基距離得到不同的距離表示式。

當p=1時,稱為曼哈頓距離,表示式如下:

當p=2時,為歐幾里得距離,最常用於度量兩點之間的直線距離。表示式如下:

距離的度量方法沒有好壞,選擇什麼方法主要是根據當前情況而定。

k值的選擇

k值的選擇會對knn演算法的結果產生重大的影響。

如果選擇較小的k值如果選擇較大的k值

減少學習的估計誤差,但缺點是學習的近似誤差會增大.

k值的增大 就意味著整體的模型變得簡單.

在應用中,k值一般取乙個比較小的數值,通常採用交叉驗證法來選取最優的k值。

分類的決策規則

根據多數表決原則,決定待分類樣本點的類別。

手寫數字識別

1)資料載入:我們可以直接從 sklearn 中載入自帶的手寫數字資料集;

2)準備階段:通過視覺化的方式來檢視影象的呈現。通過資料規範化可以讓資料都在同乙個數量級的維度。將全部的影象資料作為特徵值矩陣;

3)分類階段:通過訓練可以得到分類器,然後用測試集進行準確率的計算。

knn分類器的常用構造引數有:

1).n_neighbors 代表鄰居的數量。

2).weights: 代表所有鄰居的權重,其中 uniform 代表所有鄰居權重相同, distance 代表權重是距離的倒數。還可以自定義。

3).algorithm: 計算鄰居的方法,auto代表 根據資料的情況自動選擇,kd_tree 是kd樹,適用於維數不超過20的情況。ball_tree是球樹,可以用於維度更大的情況。brute 是暴力搜尋。

4).leaf_size:是kd樹或者球樹的葉子數量,預設是20.

sklearn**實現

from sklearn.model_selection import train_test_split

from sklearn import preprocessing

from sklearn.metrics import accuracy_score

from sklearn.datasets import load_digits

from sklearn.neighbors import kneighborsclassifier

import matplotlib.pyplot as plt

#載入資料

digits = load_digits(

)data = digits.data

#資料探索

print

(data.shape)

(1797, 64)
# 檢視第一幅影象

print

(digits.images[0]

)

[[  0.   0.   5.  13.   9.   1.   0.   0.]

[ 0. 0. 13. 15. 10. 15. 5. 0.]

[ 0. 3. 15. 2. 0. 11. 8. 0.]

[ 0. 4. 12. 0. 0. 8. 8. 0.]

[ 0. 5. 8. 0. 0. 9. 8. 0.]

[ 0. 4. 11. 0. 1. 12. 7. 0.]

[ 0. 2. 14. 5. 10. 12. 0. 0.]

[ 0. 0. 6. 13. 10. 0. 0. 0.]]

# 第一幅影象代表的數字含義

print

(digits.target[0]

)

0
# 將第一幅影象顯示出來

# 分割資料,將25%的資料作為測試集,其餘作為訓練集

train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size=

0.25

, random_state=

33)

# 採用z-score規範化

ss = preprocessing.standardscaler(

)train_ss_x = ss.fit_transform(train_x)

test_ss_x = ss.transform(test_x)

# 建立knn分類器

knn = kneighborsclassifier(n_neighbors=4)

knn.fit(train_ss_x, train_y)

predict_y = knn.predict(test_ss_x)

print

("knn準確率: %.4lf"

% accuracy_score(test_y, predict_y)

)

knn準確率: 0.9733
**中,我使用了 train_test_split 做資料集的拆分,使用 matplotlib.pyplot 工具包顯示影象,使用 accuracy_score 進行分類器準確率的計算,使用 preprocessing 中的 standardscaler 和 minmaxscaler 做資料的規範化。

李航.統計學習方法(第2版)

陳暘.資料分析實戰45講

KNN演算法原理與實現

knn k nearest neighbors 演算法不需要訓練過程,直接利用樣本之間的距離進行分類。演算法的基本過程是 給定乙個測試樣例,分別計算它與訓練集中所有樣本之間的距離,選取距離最小的k個訓練樣本對測試樣例的類別進行投票,最後將得票最多 在k個樣本中最多的類別 作為測試樣例的 類別。需要注...

KNN演算法原理

knn演算法的計算過程 knn演算法的優點和缺點 k最近鄰 k nearest neighbor,knn 演算法核心思想是如果乙個樣本在特徵空間中的k個最臨近的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。k通常是不大於20的整數。三要素為 k值的選取,距離度量的方式和分類決策規則。對於k值...

KNN演算法原理

k nearestneighbor,翻譯為k最近鄰演算法,是資料探勘演算法中最簡單的一種演算法。我們先用乙個例子體會下。我們很容易知道,這些電影的型別,那麼當有一部新電影出現的時候,可不可以對其進行自動分類了?我們可以把打鬥次數看成 x 軸,接吻次數看成 y 軸,然後在二維的座標軸上,對這幾部電影進...