Python 基于多阈值的SciPy层次树状图聚类

Python 基于多阈值的SciPy层次树状图聚类,python,scipy,hierarchical-clustering,dendrogram,Python,Scipy,Hierarchical Clustering,Dendrogram,我想将我的SciPy树状图切割成多个阈值上的多个簇 我尝试过使用fcluster,但它只能在一个阈值上进行剪切 (以下是我从另一个问题中提取的一段代码。) 因此,对于上面的树状图,我想对绿色簇在3处进行切割,但对于蓝色和红色簇,切割应在5处进行(因此它们都是一个簇)。方法fcluster可以使用monocrit参数进行切割,该参数允许您精确定位树状图上的切割位置。您希望在位置-1和-3处进行切割,其中-1是树的顶部,-3是从上到下计数的第三个节点(蓝色与绿色相交)。这就是为什么: Z = li

我想将我的SciPy树状图切割成多个阈值上的多个簇

我尝试过使用fcluster,但它只能在一个阈值上进行剪切

(以下是我从另一个问题中提取的一段代码。)


因此,对于上面的树状图,我想对绿色簇在3处进行切割,但对于蓝色和红色簇,切割应在5处进行(因此它们都是一个簇)。

方法
fcluster
可以使用
monocrit
参数进行切割,该参数允许您精确定位树状图上的切割位置。您希望在位置-1和-3处进行切割,其中-1是树的顶部,-3是从上到下计数的第三个节点(蓝色与绿色相交)。这就是为什么:

Z = linkage(distanceMatrix, method='complete')
monocrit = np.zeros((Z.shape[0], ))
monocrit[[-1, -3]] = 1
fc = fcluster(Z, 0, criterion='monocrit', monocrit=monocrit)
扁平簇将通过仅在值严格大于阈值(0)的节点上执行分离来形成

为了说明这一点,我首先用编号的叶子重做树状图:

dend = dendrogram(Z, color_threshold=4, leaf_font_size=10, labels = range(33))

然后打印平面簇:

for k in range(1, 4):
    print(np.where(fc == k))
是的

(array([30, 31, 32]),)
(array([12, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]),)
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 13, 15]),)
所以,绿色一分为二,红色和蓝色在一起

(array([30, 31, 32]),)
(array([12, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]),)
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 13, 15]),)