1. 程式人生 > >利用python內建K-Means聚類演算法實現鳶尾花資料的聚類

利用python內建K-Means聚類演算法實現鳶尾花資料的聚類

在進去聚類情況分析前,我們需要為我們的IDLE安裝sklearn庫,scikit-learn是Python的一個開源機器學習模組,它建立在NumPy,SciPy和matplotlib模組之上能夠為使用者提供各種機器學習演算法介面,可以讓使用者簡單、高效地進行資料探勘和資料分析。

python中安裝sklearn機器學習庫

pip install numpy
pip install scipy
pip install sklearn

如果安裝過程中出現報錯的話,就根據報錯的資訊來安裝所需要的元件,最終的目的是為了能夠成功的安裝sklearn庫。

K-Means聚類

然後下面我們來從sklearn庫中引入K-Means聚類演算法及匯入鳶尾花資料集。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
#from sklearn import datasets
from sklearn.datasets import load_iris

就這樣就能夠實現K-Means聚類演算法的引入及鳶尾花資料集的引入,是不是很簡單,很方面!

iris = load_iris()
X = iris.data[:] 

下面我們將引入的資料樣式print出來看看。

......
 [6.7 3.3 5.7 2.5]
 [6.7 3.  5.2 2.3]
 [6.3 2.5 5.  1.9]
 [6.5 3.  5.2 2. ]
 [6.2 3.4 5.4 2.3]
 [5.9 3.  5.1 1.8]]
(150, 4)

所引入的鳶尾花資料的形式就如上述所示,共有150行4個特徵資料。

然後我們用影象來展示下資料點的分佈情況

#繪製資料分佈圖
plt.scatter(X[:, 0], X[:, 1], c = "red", marker='o', label='see')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()

這樣就能夠看到資料點的分佈如下:

好了,下面我們來看下聚類情況,假設我們規定要聚的類別為3個,也就是設定K=3,則有

estimator = KMeans(n_clusters=3)#構造聚類器
estimator.fit(X)#聚類
label_pred = estimator.labels_ #獲取聚類標籤

這樣我們同樣用影象來輸出最終的聚類情況如下;

輸出影象的程式碼為:

#繪製k-means結果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='*', label='label1')
plt.scatter(x2[:, 0], x2[:, 1], c = "blue", marker='+', label='label2')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()

看到上面的聚類效果其實並不理想,這樣我們選擇鳶尾花的最後兩個特徵來看下效果:

首先修改資料為:

X = iris.data[:,2:] ##表示我們只取特徵空間中的後兩個維度

 聚類效果為:

從上述兩種聚類效果來分析,能夠看出當選取鳶尾花最後兩個特徵作為聚類資料時,聚類的效果更好。

這樣我們給出完整的程式碼為:

#############K-means-鳶尾花聚類############
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
#from sklearn import datasets
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:] ##表示我們只取特徵空間中的後兩個維度
#繪製資料分佈圖
plt.scatter(X[:, 0], X[:, 1], c = "red", marker='o', label='see')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()


estimator = KMeans(n_clusters=3)#構造聚類器
estimator.fit(X)#聚類
label_pred = estimator.labels_ #獲取聚類標籤
#繪製k-means結果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='*', label='label1')
plt.scatter(x2[:, 0], x2[:, 1], c = "blue", marker='+', label='label2')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()