kNN處理鳶尾花資料集

2021-09-29 11:11:16 字數 3322 閱讀 2762

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 來**。

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

)

為了方便理解 knn,將鳶尾花的訓練資料的前兩個特徵值,分別作為 x 軸和 y 軸資料,進行視覺化。

# 資料視覺化

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 個近鄰的訓練例項中的多數類決定輸入例項的類。

**如下:

# 計算距離,預設為歐氏距離

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

)print

("accuracy is: %.3f"

%(correct/

len(x_test)

))

這裡是自己實現的分類**,在 sklearn 中有封裝好的 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

)print

("accuracy is: %.3f"

%(correct/

len(x_test)

))

knn 沒有顯式的學習過程,這是它的優點,但在用它進行資料分類時,需要注意幾個問題:

鳶尾花資料集

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...