机器学习 - 聚合聚类



聚合聚类是一种层次聚类算法,它从将每个数据点作为其自身集群开始,并迭代地合并最接近的集群,直到达到停止标准。这是一种自下而上的方法,它会生成一个树状图,该图显示集群之间的层次关系。该算法可以使用 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()

聚合聚类的优点

以下是使用聚合聚类的优点:

  • 生成一个树状图,显示集群之间的层次关系。

  • 可以处理不同类型的距离度量和连接方法。

  • 允许从数据中提取灵活数量的集群。

  • 可以使用高效的实现来处理大型数据集。

聚合聚类的缺点

以下是使用聚合聚类的一些缺点:

  • 对于大型数据集,计算成本可能很高。

  • 如果距离度量或连接方法不适合数据,则可能会产生不平衡的集群。

  • 最终结果可能对所使用的距离度量和连接方法的选择敏感。

  • 对于具有许多集群的大型数据集,树状图可能难以解释。

广告