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
#資料探索
(data.shape)
(1797, 64)
# 檢視第一幅影象
(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.]]
# 第一幅影象代表的數字含義
(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 軸,然後在二維的座標軸上,對這幾部電影進...