knn(k nearest neighbor)演算法是機器學習中最基礎入門,也是最常用的演算法之一,可以解決大多數分類與回歸問題。這裡以鳶尾花資料集為例,討論分類問題中的 knn 的思想。
鳶尾花資料集內包含 3 類共 150 條記錄,每類各 50 個資料,每條記錄都有 4 項特徵:花萼長度(sepal length)、花萼寬度(sepal width)、花瓣長度(petal length)、花瓣寬度(petal length)。
可以通過這 4 個特徵**鳶尾花卉屬於(iris-setosa,,iris-versicolour, iris-virginica)中的哪一品種,這裡使用 knn 來**。
為了方便理解 knn,將鳶尾花的訓練資料的前兩個特徵值,分別作為 x 軸和 y 軸資料,進行視覺化。iris = datasets.load_iris(
)x = iris.data
y = iris.target
# 隨機劃分資料集
x_train, x_test, y_train, y_test = train_test_split(x, y,
test_size=
0.2, random_state=
20, shuffle=
true
)
如圖所示,三個不同的顏色分別代表鳶尾花的三個類別。現在如果有乙個新的資料(圖中黑色點表示),如何判斷它屬於哪個類別呢?# 資料視覺化
plt.scatter(x_train[y_train ==0]
[:,0
], x_train[y_train ==0]
[:,1
], color=
'r')
plt.scatter(x_train[y_train ==1]
[:,0
], x_train[y_train ==1]
[:,1
], color=
'g')
plt.scatter(x_train[y_train ==2]
[:,0
], x_train[y_train ==2]
[:,1
], color=
'b')
plt.xlabel(
'sepal length'
)plt.ylabel(
'sepal width'
)plt.show(
)
我們需要使用的 knn 演算法,正如它的英文 k nearest neighbor,演算法的核心思想是,選取訓練集中離該資料最近的 k 個點,它們中的大多數屬於哪個類別,則該新資料就屬於哪個類別。
根據它的核心思想,模型中有三個需要確定的要素:
其中,k 的選擇是乙個超引數的選擇問題,需要通過調整 k 的值確定最好的 k,最好選奇數,否則會出現同票。
可以通過交叉驗證法確定模型的最佳 k 值(這裡後面會談);
度量距離的方式,一般為 lp 距離:
p = 1 時,為曼哈頓距離:
p = 2 時,為歐式距離:
歐式距離是我們最常用的計算距離的方式。
分類的規則,採取多數表決的原則,即由輸入例項的 k 個近鄰的訓練例項中的多數類決定輸入例項的類。
**如下:
這裡是自己實現的分類**,在 sklearn 中有封裝好的 knn 庫,**如下:# 計算距離,預設為歐氏距離
defcalculatedistance
(data1, data2, p=2)
:iflen(data1)
==len
(data2)
andlen
(data1)
>=1:
sum=
0for i in
range
(len
(data1)):
sum+= math.
pow(
abs(data1[i]
- data2[i]
), p)
dist = math.
pow(
sum,
1/p)
return dist
# knn模型分類
defknnclassify
(x_train, y_train, test_data, k)
: dist =
[calculatedistance(train_data, test_data)
for train_data in x_train]
# 返回距離最近的k個訓練樣本的索引(下標)
indexes = np.argsort(dist)
[:k]
count = counter(y_train[indexes]
)return count.most_common(1)
[0][
0]if __name__ ==
'__main__'
:# **結果
predictions =
[knnclassify(x_train, y_train, test_data,3)
for test_data in x_test]
# 與實際結果對比
correct = np.count_nonzero(
(predictions == y_test)
==true
("accuracy is: %.3f"
%(correct/
len(x_test)
))
knn 沒有顯式的學習過程,這是它的優點,但在用它進行資料分類時,需要注意幾個問題:# 建立knn_classifier例項
knn_classifier = kneighborsclassifier(n_neighbors=3)
# knn_classifier做一遍fit(擬合)的過程,沒有返回值,模型就儲存在knn_classifier例項中
knn_classifier.fit(x_train, y_train)
correct = np.count_nonzero(
(knn_classifier.predict(x_test)
== y_test)
==true
("accuracy is: %.3f"
%(correct/
len(x_test)
))
鳶尾花資料集
from sklearn import datasets iris datasets.load iris iris是乙個字典集keys iris.keys dict keys data target target names descr feature names data iris.data.sh...
knn演算法 鳶尾花
knn分類演算法實現鳶尾花 對鳶尾花利用knn演算法進行分類,利用python的sklean庫極大方便了python的使用,減少了大量 的書寫。knn演算法的 是通過計算歐氏距離來確定 鳶尾花的結果,遍歷所有樣本集,計算待分類樣本與每個樣本的距離,計算並儲存後排序,尋找k個近鄰,最後輸出最小結果即為...
knn 鳶尾花例子
1.獲取資料集 2.資料基本處理 3.特徵工程 4.機器學習 模型訓練 5.模型評估 from sklearn.datasets import load iris from sklearn.model selection import train test split from sklearn.pr...