機器學習 - 聚合聚類



聚合聚類是一種層次聚類演算法,它從將每個資料點作為其自身叢集開始,並迭代地合併最接近的叢集,直到達到停止標準。這是一種自下而上的方法,它會生成一個樹狀圖,該圖顯示叢集之間的層次關係。該演算法可以使用 Python 中的 scikit-learn 庫來實現。

Python 實現

我們將使用 iris 資料集進行演示。第一步是匯入必要的庫並載入資料集。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage

iris = load_iris()
X = iris.data
y = iris.target

下一步是建立一個連線矩陣,其中包含每對叢集之間的距離。我們可以使用 `scipy.cluster.hierarchy` 模組中的 `linkage` 函式來建立連線矩陣。

Z = linkage(X, 'ward')

`ward` 方法用於計算叢集之間的距離。它最小化了被合併的叢集之間距離的方差。

我們可以使用同一模組中的 `dendrogram` 函式來視覺化樹狀圖。

plt.figure(figsize=(7.5, 3.5))
plt.title("Iris Dendrogram")
dendrogram(Z)
plt.show()

生成的樹狀圖(見下圖)顯示了叢集之間的層次關係。我們可以看到,該演算法首先合併了最接近的叢集,並且隨著我們向上移動樹,叢集之間的距離會增加。

Agglomerative Clustering

最後一步是應用聚類演算法並提取叢集標籤。我們可以使用 `sklearn.cluster` 模組中的 `AgglomerativeClustering` 類來應用該演算法。

model = AgglomerativeClustering(n_clusters=3)
model.fit(X)
labels = model.labels_

`n_clusters` 引數指定要從資料中提取的叢集數量。在本例中,我們指定了 `n_clusters=3`,因為我們知道 iris 資料集有三個類別。

我們可以使用散點圖來視覺化生成的叢集。

plt.figure(figsize=(7.5, 3.5))
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.xlabel("Sepal length")
plt.ylabel("Sepal width")
plt.title("Agglomerative Clustering Results")
plt.show()

生成的圖表顯示了演算法識別的三個叢集。我們可以看到,該演算法已成功地將資料點分離到各自的類別中。

agglomerative_clustering_results

示例

以下是 Python 中聚合聚類的完整實現:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target
Z = linkage(X, 'ward')

# Plot the dendogram
plt.figure(figsize=(7.5, 3.5))
plt.title("Iris Dendrogram")
dendrogram(Z)
plt.show()

# create an instance of the AgglomerativeClustering class
model = AgglomerativeClustering(n_clusters=3)

# fit the model to the dataset
model.fit(X)
labels = model.labels_

# Plot the results
plt.figure(figsize=(7.5, 3.5))
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.xlabel("Sepal length")
plt.ylabel("Sepal width")
plt.title("Agglomerative Clustering Results")
plt.show()

聚合聚類的優點

以下是使用聚合聚類的優點:

  • 生成一個樹狀圖,顯示叢集之間的層次關係。

  • 可以處理不同型別的距離度量和連線方法。

  • 允許從資料中提取靈活數量的叢集。

  • 可以使用高效的實現來處理大型資料集。

聚合聚類的缺點

以下是使用聚合聚類的一些缺點:

  • 對於大型資料集,計算成本可能很高。

  • 如果距離度量或連線方法不適合資料,則可能會產生不平衡的叢集。

  • 最終結果可能對所使用的距離度量和連線方法的選擇敏感。

  • 對於具有許多叢集的大型資料集,樹狀圖可能難以解釋。

廣告