层次聚类算法是一种无监督学习算法,用于将数据点分成不同的簇(cluster),并构建一个层次化的聚类结构。该算法的结果是一个聚类树,也称为树状图,其中每个节点代表一个簇,叶子节点代表单个数据点。
层次聚类算法有两种主要的方法:凝聚式聚类和分裂式聚类。
凝聚式聚类(Agglomerative Clustering):
开始时,将每个数据点看作一个独立的簇。 在每次迭代中,合并最近的两个簇,形成一个新的父簇。 重复上述步骤,直到所有数据点都被合并为一个簇。 这样形成的层次聚类树可以通过剪枝来确定聚类的数量。 分裂式聚类(Divisive Clustering):
开始时,将所有数据点视为一个簇。 在每次迭代中,选择一个簇并将其分成两个子簇。 重复上述步骤,直到达到所需的簇的数量。 层次聚类算法的步骤如下:
计算距离或相似度矩阵,用于衡量数据点之间的距离或相似度。
将每个数据点视为单个簇。
选择最近的两个簇,将它们合并成一个新的簇。
更新距离矩阵,将新的簇添加到矩阵中。
重复步骤3和4,直到达到所需的簇的数量或仅剩下一个簇。
层次聚类的优点是它不需要预先指定簇的数量,可以提供多层次的聚类结果。然而,层次聚类的计算复杂度较高,特别是在处理大规模数据时。
在Python中,你可以使用scikit-learn等机器学习库来实现层次聚类算法。示例代码已在之前的回答中提供。在实际应用中,你可以根据数据特点选择适合的聚类方法,以及对层次聚类树进行剪枝以确定最终的聚类数量。
以下是使用Python和scikit-learn库实现凝聚式层次聚类算法的示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
# 生成示例数据
n_samples = 300
n_features = 2
n_clusters = 3
random_state = 42
X, _ = make_blobs(n_samples=n_samples, n_features=n_features, centers=n_clusters, random_state=random_state)
# 创建层次聚类模型
agg_clustering = AgglomerativeClustering(n_clusters=n_clusters, linkage='ward')
# 在数据上进行聚类
labels = agg_clustering.fit_predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.title("Agglomerative Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
# 绘制层次聚类树(谱系图)
linked = linkage(X, method='ward')
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title("Hierarchical Clustering Dendrogram")
plt.xlabel("Sample Index")
plt.ylabel("Distance")
plt.show()
在这个示例中,我们使用make_blobs函数生成一个包含3个聚类中心的示例数据集。然后,我们使用AgglomerativeClustering类创建了一个凝聚式层次聚类模型,并在数据集上进行聚类。使用dendrogram函数绘制了层次聚类树(谱系图),其中每个叶子节点代表一个数据点,节点之间的连接表示聚类的合并过程。
你可以根据实际数据和需求调整参数,例如聚类的数量、链接方式(linkage)等。此外,你还可以使用其他层次聚类的方法,如平均链接(average)和完全链接(complete)。
注意:本文归作者所有,未经作者允许,不得转载