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型數,表示準確率。