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