K臨近分類是一種監督式的分類方法,首先根據已標記的數據對模型進行訓練,而後根據模型對新的數據點進行預測,預測新數據點的標籤(label),也就是該數據所屬的分類。html
kNN算法的核心思想是:若是一個數據在特徵空間中最相鄰的k個數據中的大多數屬於某一個類別,則該樣本也屬於這個類別(相似投票),並具備這個類別上樣本的特性。通俗地說,對於給定的測試樣本和基於某種度量距離的方式,經過最靠近的k個訓練樣原本預測當前樣本的分類結果。算法
例如,借用百度的一張圖來講明kNN算法過程,要預測圖中Xu的分類結果,先預設一個距離值,只考慮以Xu爲圓心以這個距離值爲半徑的圓內的已知訓練樣本,而後根據這些樣本的投票結果來預測Xu屬於w1類別,投票結果是4:1。併發
kNN算法在肯定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。kNN算法在類別決策時,只與極少許的相鄰樣本有關。因爲kNN算法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來肯定所屬類別的,所以對於類域的交叉或重疊較多的待分樣本集來講,kNN方法較其餘方法更爲適合。dom
1,kNN算法的計算步驟ide
kNN算法就是根據距離待分類樣本A最近的k個樣本數據的分類來預測A可能屬於的類別,基本的計算步驟以下:函數
計算距離的方法有:"euclidean"(歐氏距離),」minkowski」(明科夫斯基距離), "maximum"(切比雪夫距離), "manhattan"(絕對值距離),"canberra"(蘭式距離), 或 "minkowski"(馬氏距離)等。學習
2,kNN算法如何計算距離?測試
在計算距離以前,須要對每一個數值屬性進行規範化,這有助於避免較大初始值域的屬性比具備較小初始值域的屬性的權重過大。idea
3,kNN算法如何肯定k的值?spa
k的最優值,須要經過實驗來肯定。從k=1開始,使用檢驗數據集來估計分類器的錯誤率。重複該過程,每次k增長1,容許增長一個近鄰,選取產生最小錯誤率的k。通常而言,訓練數據集越多,k的值越大,使得分類預測能夠基於訓練數據集的較大比例。在應用中,通常選擇較小k而且k是奇數。一般採用交叉驗證的方法來選取合適的k值。
使用KNeighborsClassifier建立K臨近分類器:
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30,
p=2, metric=’minkowski’, metric_params=None, n_jobs=None, **kwargs)
參數註釋:
1,n_neighbors
臨近的節點數量,默認值是5
2,weights
權重,默認值是uniform,
3,algorithm
4,leaf_size
leaf_size傳遞給BallTree或者KDTree,表示構造樹的大小,用於影響模型構建的速度和樹須要的內存數量,最佳值是根據數據來肯定的,默認值是30。
5,p,metric,metric_paras
6,n_jobs
併發執行的job數量,用於查找鄰近的數據點。默認值1,選取-1佔據CPU比重會減少,但運行速度也會變慢,全部的core都會運行。
7,舉個例子
下面的代碼是最簡單的knn分類器,能夠看出,knn分類模型是由兩部分構成的:第一部分是擬合數據(fit),也就是訓練模型,第二部分是預測數據(predict)。
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3) x_train = [[0], [1], [2], [3]] y_train = [0, 0, 1, 1] knn.fit(x_train,y_train) x_new=[[1.1]] pred=knn.predict(x_new) print('pred:{0}'.format(pred))
因爲knn分類是監督式的分類方法以前,在構建一個複雜的分類模型以前,首先須要已標記的數據集。咱們能夠從sklearn的數據集中加載已有的數據進行學習:
from sklearn.datasets import load_iris iris_dataset=load_iris()
查看iris_dataset的數據,該對象的結構和字典很是類型:
>>> iris_dataset.keys() dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
1,樣本數據
data 是樣本數據,共4列150行,列名是由feature_names來肯定的,每一列都叫作矩陣的一個特徵(屬性),前4行的數據是:
>>> iris_dataset.data[0:4] array([[5.1, 3.5, 1.4, 0.2], [4.9, 3. , 1.4, 0.2], [4.7, 3.2, 1.3, 0.2], [4.6, 3.1, 1.5, 0.2]])
2,標籤
target是標籤,用數字表示,target_names是標籤的文本表示
>>> iris_dataset.target[0:4] array([0, 0, 0, 0]) >>> iris_dataset.target_names array(['setosa', 'versicolor', 'virginica'], dtype='<U10')
3,查看數據的散點圖
查看數據的散點圖矩陣,按照數據的類別進行着色,觀察數據的分佈:
import pandas as pd import mglearn iris_df=pd.DataFrame(x_train,columns=iris_dataset.feature_names) pd.plotting.scatter_matrix(iris_df,c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20} ,s=60,alpha=.8,cmap=mglearn.cm3)
咱們使用sklearn數據集中的鳶尾花測量數據來構建一個複雜的分類模型,並根據輸入的數據點來預測鳶尾花的類別。
1,拆分數據
把鳶尾花數據拆分爲訓練集和測試集:
from sklearn.model_selection import train_test_split x_train,x_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
2,建立分類器
使用KNeighborsClassifier建立分類器,設置參數n_neighbors爲1:
from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=1)
3,使用訓練集來構建模型
對於監督學習,訓練數據集包括兩部分:輸入和結果(Lable),每一行輸入都對應一行結果,結果是輸入的正確分類(標籤)。
一般,記X_train是訓練的輸入數據集,X_train對應的結果是y_train,是訓練數據集的輸出,經過fit()函數來訓練模型,構建模型:
knn.fit(x_train, y_train)
4,預測新數據
對於訓練以後的模型,使用predict()函數來預測數據的結果。
x_new=np.array([[5, 2.9, 1, 0.2]]) prediction= knn.predict(x_new) print("prediction :{0} ,classifier:{1}".format(prediction,iris_dataset["target_names"][prediction]))
5,評估模型
在使用模型以前,應該使用測試集來評估模型:
y_pred=knn.predict(x_test) assess_model_socre=knn.score(x_test,y_test) print('Test set score:{:2f}'.format(assess_model_socre))
參考文檔: