1.KNN算法介紹
KNN算法的思想:在訓練集中數據和標簽已知的情況下,輸入測試數據,將測試數據的特征與訓練集中對應的特征進行相互比較,找到訓練集中與之最為相似的前K個數據,則該測試數據對應的類別就是K個數據中出現次數最多的那個分類。
其算法的描述為:
1)計算測試數據與各個訓練數據之間的距離;
2)按照距離的遞增關系進行排序;
3)選取距離最小的K個點;
4)確定前K個點所在類別的出現頻率;
5)返回前K個點中出現頻率最高的類別作為測試數據的預測分類。
2.例子:KNN實現鳶尾數據集分類
鳶尾數據集一共有150個數據樣本,並且均勻分布在3個不同的亞種;每個數據樣本被4個不同的花瓣、花萼的形狀特征所描述。
數據集包含了三類分別為:setosa, versicolor, virginica
數據集測量了所有150個樣本的4個特征,分別是:
- sepal length(花萼長度)
- sepal width(花萼寬度)
- petal length(花瓣長度)
- petal width(花瓣寬度)
以上四個特征的單位都是厘米(cm)
樣本特征:
[5. 2.3 3.3 1. ]
[4.9 3.1 1.5 0.1]
[6.3 2.3 4.4 1.3]
[5.8 2.6 4. 1.2]
[6.2 2.9 4.3 1.3]
[4.7 3.2 1.3 0.2]
[4.6 3.4 1.4 0.3]
。。。。
標簽:0,1,2
代碼:
#coding=utf-8 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import classification_report #1.數據獲取 iris = load_iris() print iris.data.shape #2.數據預處理:訓練集測試集分割,數據標准化 X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.25,random_state=33) # 對訓練和測試的特征數據進行標准化 ss = StandardScaler() X_train = ss.fit_transform(X_train) X_test = ss.transform(X_test) # 3.使用K臨近分類器對測試數據進行類別預測 knc = KNeighborsClassifier() knc.fit(X_train,y_train) y_predict = knc.predict(X_test) #4.獲取結果報告 print 'The Accuracy of K-Nearest Neighbor Classifier is', knc.score(X_test,y_test) print classification_report(y_test,y_predict,target_names=iris.target_names)
結果:
特點:K近鄰模型沒有參數訓練過程,而是根據測試樣本在訓練數據的分布直接作出分類決策。
缺點是非常高的計算復雜度和內存消耗:需要遍歷每個訓練樣本、逐一計算相似度並排序。