我正在使用seaborn clustermap
创建集群,并且在视觉上它工作得很好(这个example产生了非常相似的结果)。
但是,我很难找出如何以编程方式提取集群。例如,在示例链接中,我如何发现1-1rh、1-1lh、5-1rh、5-1lh是一个好的集群?视觉上很容易。我试着用各种方法查看数据和树状图,但收效甚微
编辑示例中的代码:
import pandas as pd
import seaborn as sns
sns.set(font="monospace")
df = sns.load_dataset("brain_networks", header=[0, 1, 2], index_col=0)
used_networks = [1, 5, 6, 7, 8, 11, 12, 13, 16, 17]
used_columns = (df.columns.get_level_values("network")
.astype(int)
.isin(used_networks))
df = df.loc[:, used_columns]
network_pal = sns.cubehelix_palette(len(used_networks),
light=.9, dark=.1, reverse=True,
start=1, rot=-2)
network_lut = dict(zip(map(str, used_networks), network_pal))
networks = df.columns.get_level_values("network")
network_colors = pd.Series(networks).map(network_lut)
cmap = sns.diverging_palette(h_neg=210, h_pos=350, s=90, l=30, as_cmap=True)
result = sns.clustermap(df.corr(), row_colors=network_colors, method="average",
col_colors=network_colors, figsize=(13, 13), cmap=cmap)
我怎样才能从result
中提取出哪些集群的模型?
EDIT2这个result
带有一个linkage
和dendrogram_col
一起,我认为它可以和fcluster一起工作。但要选择的阈值让我困惑。我假设热图中高于阈值的值会聚集在一起?
您可能需要在数据帧中添加具有群集成员身份的新列。我从网上偷来的汇编代码片段中成功做到了这一点:
所以这给了你一个列,用“g”或“r”表示绿色或红色标记的簇。我通过绘制树状图和观察y轴值来确定我的颜色阈值。
虽然使用
result.linkage.dendrogram_col
或result.linkage.dendrogram_row
目前可以工作,但这似乎是一个实现细节。最安全的方法是首先显式地计算链接并将它们传递给clustermap
函数,该函数仅具有row_linkage
和col_linkage
参数。用下面的代码替换示例(
result =
…)中的最后一行可以得到与前面相同的结果,但是您还可以使用row_linkage
和col_linkage
变量来处理fcluster
等在这个特定的例子中,由于关联数组是对称的,因此
row_linkage
和col_linkage
将是相同的,所以代码可以简化得更多。注意:之前的回答包括根据seaborn中的代码所做的调用
distance.squareshape
,但是is a bug。相关问题 更多 >
编程相关推荐