使用 Python 中的 Scikit-Learn 對手寫數字資料進行 K 均值聚類
簡介
聚類是一種在無監督機器學習中非常重要的技術,它根據共享的特徵將相似的資料片段組合在一起。K 均值聚類是一種流行的聚類演算法。K 均值演算法是一種迭代演算法,它將資料分成 K 個叢集,其中 K 是一個預定義的數字。該過程最小化了聚類中心與資料點之間平方距離的總和。在這篇文章中,我們將瞭解如何使用 Python 的 Scikit-Learn 庫對手寫數字資料執行 K 均值聚類。
定義
K 均值聚類是一種簡單而有效的無監督學習方法,旨在將資料集劃分為 K 個不同的、不重疊的聚類。它的工作原理是將每個資料點分配到其最近的質心,質心是分配給該聚類所有點的算術平均值。然後,演算法迭代地重新計算質心,以最小化資料點與其對應質心之間平方距離的總和。此過程重複進行,直到收斂或達到預定義的迭代次數。
語法
from sklearn.cluster import KMeans # Load the digits dataset from sklearn.datasets import load_digits digits = load_digits() # Create a K-Means clustering model kmeans = KMeans(n_clusters=K) # Fit the model to the data kmeans.fit(digits.data) # Predict the cluster labels for the data labels = kmeans.predict(digits.data)
匯入所需的庫。從 sklearn.cluster 包中匯入 KMeans 類。我們還透過 sklearn.datasets 包中的 load_digits 方法匯入手寫數字資料集。
使用 load_digits 函式載入手寫數字資料集。此資料集包含手寫數字的影像,每個數字都是一個 8x8 畫素的影像。
初始化一個 KMeans 類例項以建立 K 均值聚類模型。n_clusters 引數指定我們想要建立的聚類數量 (K)。我們可以根據資料集和問題選擇任何 K 值。
呼叫 fit 方法,並將資料集作為引數傳遞,以將 K 均值模型擬合到資料。此步驟確定聚類中心並將每個資料點對映到其最近的質心。
使用 predict 方法預測資料點聚類的標籤。每個資料點都分配了一個標籤,對應於它所屬的聚類。
演算法
步驟 1 − 應隨機或使用指定的初始化方法初始化 K 個聚類中心。
步驟 2 − 基於歐幾里得距離,將每個資料點放置到其最近的質心旁邊。
步驟 3 − 計算分配給每個聚類所有資料點的平均值以更新質心。
步驟 4 − 根據需要重複步驟 2 和 3,直到收斂或達到分配的迭代次數。
步驟 5 − 我們得到最終的聚類分配。
方法
方法 1 − 聚類手寫數字資料
方法 2 − 評估聚類效能
方法 1:聚類手寫數字資料
示例
# Import the necessary libraries from sklearn.cluster import KMeans from sklearn.datasets import load_digits import matplotlib.pyplot as plt # Load the digits dataset digits = load_digits() # Create a K-Means clustering model kmeans = KMeans(n_clusters=10) # Fit the model to the data kmeans.fit(digits.data) # Predict the cluster labels for the data labels = kmeans.predict(digits.data) # Visualize the cluster centroids fig, ax = plt.subplots(2, 5, figsize=(8, 3)) centers = kmeans.cluster_centers_.reshape(10, 8, 8) for axi, center in zip(ax.flat, centers): axi.set(xticks=[], yticks=[]) axi.imshow(center, interpolation='nearest', cmap=plt.cm.binary) # Show the plot plt.show()
輸出
由於資料集中有 10 個不同的數字 (0-9),因此我們接下來透過初始化一個具有 n_clusters=10 的 KMeans 類的例項來建立一個 K 均值聚類模型。
然後,我們使用 fit 方法將模型擬合到資料,該方法確定聚類中心並將每個資料點相對於其最近的質心放置。
為了視覺化聚類中心,我們將聚類中心調整為 8x8 影像,並使用 matplotlib 繪製它們。生成的圖顯示了每個聚類的代表性影像。
在這裡,我們使用 plt.show() 在程式結束時顯示繪圖。
程式碼的輸出是一個包含 10 個子圖的繪圖,這些子圖以 2x5 網格的形式排列。對於給定的數字,每個子圖對應於一個聚類中心。由於初始化完全隨機,因此每次執行給定程式時,輸出可能會有所不同。灰度質心影像顯示了每個聚類的平均數字影像。由於聚類中心的初始位置是隨機選擇的,因此聚類結果可能略有不同。因此,生成的聚類中心及其在繪圖中的排列方式在不同的執行之間可能會發生變化。
方法 2:評估聚類效能
示例
# Import the necessary libraries
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
from sklearn.metrics import silhouette_score
# Load the digits dataset
digits = load_digits()
# Create a K-Means clustering model
kmeans = KMeans(n_clusters=10)
# Fit the model to the data
kmeans.fit(digits.data)
# Predict the cluster labels for the data
labels = kmeans.predict(digits.data)
# Evaluate the clustering performance
score = silhouette_score(digits.data, labels)
print("Silhouette Score:", score)
輸出
Silhouette Score: 0.18185624794421412
之後,我們將一個 K 均值聚類模型擬合到資料,並將 n_clusters 設定為 10。
然後,將資料點的預測聚類標籤新增到 labels 變數中。
我們使用 sklearn.metrics 中的 silhouette_score 函式來評估聚類的效能。此度量評估資料點聚類緊密程度的值範圍從 -1 到 1。較高的值表示聚類效能更好。
在最後一步,我們列印輪廓分數以評估聚類結果的質量。
輸出顯示在冒號之後,將顯示實際的分數值。輪廓分數範圍從 -1 到 1,分數越高表示聚類結果越好。它評估資料集中的每個樣本與其分配的聚類相比,在多大程度上適合該聚類。分數越接近 1,聚類就越突出且分離得越好。執行程式碼時,將使用 K 均值演算法對數字資料集進行聚類以獲得輪廓分數。輸出將是分數,並列印到控制檯。
結論
K 均值聚類是一種靈活的方法,可用於在各種形式的資料中查詢隱藏模式並將相關資料點組合在一起。透過理解和應用 K 均值聚類,您可以從資料中提取有價值的見解並做出明智的決策。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP