📅  最后修改于: 2023-12-03 15:23:27.333000             🧑  作者: Mango
分层树状图是一种可视化结构,通常用于聚类分析。但有时候,我们需要将分层树状图切割成更小的簇。在本教程中,我们将介绍如何在 Python 中使用 SciPy 库来实现这个目标。
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
import matplotlib.pyplot as plt
%matplotlib inline
首先,我们需要导入 numpy、scipy.cluster.hierarchy 和 matplotlib.pyplot 库。这些库是本教程所需的基本库。
下面我们将创建一个简单的数据集来执行分层聚类分析:
np.random.seed(4711)
a = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[100,])
b = np.random.multivariate_normal([0, 20], [[3, 1], [1, 4]], size=[50,])
X = np.concatenate((a, b),)
plt.scatter(X[:,0], X[:,1])
plt.show();
我们创建了一个由两个高斯分布混合而成的数据集。接下来绘制数据集的散点图。
下一步是计算距离矩阵。我们可以使用 linkage 函数来执行层次聚类,并返回 Z 矩阵。其中 linkage 函数的输入是距离矩阵,而距离矩阵的计算方式由我们自己定义:
Z = linkage(X, 'ward')
这里我们使用了"ward"方法,即使用簇内平方和的减小来计算距离矩阵。
现在我们可以使用 dendrogram 函数来绘制分层树状图。如下所示:
plt.figure(figsize=(10, 8))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('sample index')
plt.ylabel('distance')
dendrogram(Z, leaf_rotation=90., leaf_font_size=8.)
plt.show()
这里我们设置了一些参数,如图的大小和标题。参数 leaf_rotation 和 leaf_font_size 分别用于设置叶子节点的旋转角度和字体大小。
现在我们可以使用 fcluster 函数将分层树状图切割成更小的簇。如下所示:
max_d = 50
clusters = fcluster(Z, max_d, criterion='distance')
print(clusters)
这里我们设置了 max_d 参数作为阈值。所有距离小于 max_d 的数据点将被归为同一个簇。criterion 参数用于指定阈值的类型。在本例中,我们使用了 "distance" 类型。
我们可以通过绘制散点图,将切割后的簇可视化。如下所示:
plt.figure(figsize=(10, 8))
plt.scatter(X[:,0], X[:,1], c=clusters, cmap='prism')
plt.show()
这里我们使用了参数 c 和 cmap。其中,c 用于指定颜色,cmap 用于指定颜色映射。
至此,我们已经介绍了使用 SciPy 将分层树状图切割成簇的方法。在实际工作中,你可以使用这种方法来对聚类结果进行进一步处理和分析。