1. 程式人生 > >Sklearn之KNN演算法

Sklearn之KNN演算法

KNN演算法原理

K近鄰是機器學習中常見的分類方法之間,也是相對最簡單的一種分類方法,屬於監督學習範疇。其實K近鄰並沒有顯式的學習過程,它的學習過程就是測試過程。

k近鄰演算法思想:先給你一個訓練資料集D,包括每個訓練樣本對應的標籤。然後給你一個新的測試樣本T,問你測試樣本的標籤預測是什麼,K近鄰的方法就是找到T到D中每一個樣本的相似度,然後根據相似度大小對D中樣本排序,取前K個最相似的樣本的標籤的眾數作為測試樣本T的標籤(即前K個樣本投票決定)。具體相似度怎麼度量,是根據測試樣本到D中每個訓練樣本的距離度量,一般用的最多的是歐氏距離,也可以更廣泛的p範數(歐氏距離是2範數)。

譬如曼哈頓距離。
在這裡插入圖片描述
當p=1時為曼哈頓距離,p=2時為最常用的歐氏距離。

基於sklearn包的KNN演算法實現

import numpy as np
from sklearn import datasets  #包含很多資料集的模組
from sklearn.model_selection import train_test_spilt  #將訓練集和測試集分開的模組
from sklearn.neighbors import KNeighborsClassifier  # K-近鄰演算法模組
import matplotlib.pyplot as plt

data = datasets.load_digits()  #匯入數字資料集
data_x = data.data   #特徵,size為(1797*64),即1797個樣本,每個樣本有64個特徵
data_y = data.target   #標籤

#將資料集和訓練集按7:3的比例分開
train_x,test_x,train_y,test_y = train_test_split(data_x,data_y,test_size=0.3) 
knn = KNeighborsClassifier(n_neighbors=5)  #構建k值為5的knn演算法模型
knn.fit(train_x,train_y)   #訓練
probability = knn.predict_proba(test_x[:10,:])  #計算各測試樣本基於概率的預測
print(knn.score(test_x,test_y))  #對訓練結果進行評估,計算出準確率
print(probability)
print(knn.predict(test_x[:10,:]))
0.9851851851851852
[[0.  0.  0.  0.  0.  0.  1.  0.  0.  0. ]
 [0.  0.  0.  0.  0.  0.  0.  1.  0.  0. ]
 [0.  1.  0.  0.  0.  0.  0.  0.  0.  0. ]
 [1.  0.  0.  0.  0.  0.  0.  0.  0.  0. ]
 [0.  0.  0.  0.8 0.  0.  0.  0.  0.  0.2]
 [0.  0.2 0.  0.  0.  0.  0.  0.  0.8 0. ]
 [0.  0.  0.  0.  0.  0.  0.  1.  0.  0. ]
 [0.  0.  0.  0.  0.  0.  1.  0.  0.  0. ]
 [0.  0.  0.  0.  0.  0.  0.  1.  0.  0. ]
 [0.  1.  0.  0.  0.  0.  0.  0.  0.  0. ]]
[6 7 1 0 3 8 7 6 7 1]

KNeighborsClassifier類的引數說明

n_neighbours
int 型引數,knn演算法中指定以最近的幾個最近鄰樣本具有投票權,預設引數為5

weights
str引數, 即每個擁有投票權的樣本是按什麼比重投票,'uniform’表示等比重投票,‘distance’表示按距離反比投票。預設’uniform’。

p
int型引數,p=2為歐氏距離,p=1為曼哈頓距離。預設為2

n_jobs
int型引數,指平行計算的執行緒數量,預設為1表示一個執行緒,為-1表示cpu的核心數。

KNeighborsClassifier類的方法說明

fit()
簡單來說就是訓練函式,接收引數為兩個,訓練集特徵x和訓練集標籤y。該方法不是此類所特有的,簡單來說就是所有的sklearn包中的機器學習演算法都有該方法。

predict()
預測函式,輸入引數為測試集特徵x。

predict_prob()
也是預測函式,只不過輸出的是基於概率的預測。

socre()
打分函式。接受引數有3個。
-X:接收輸入的陣列型別測試樣本,一般是二維陣列,每一行是一個樣本,每一列是一個屬性。
-y:X這些預測樣本的真實標籤,一維陣列或者二維陣列。
-sample_weight=None,是一個和X第一位一樣長的各樣本對準確率影響的權重,一般預設為None.
輸出為一個float型數,表示準確率。