从seaborn clustermap中提取集群

时间:2015-01-13 14:48:41

标签: python cluster-analysis hierarchical-clustering seaborn dendrogram

我正在使用seaborn clustermap来创建群集,并且视觉效果很好(此example会产生非常相似的结果)。

但是,我无法弄清楚如何以编程方式提取群集。例如,在示例链接中,我怎么能发现1-1 rh,1-1 lh,5-1 rh,5-1 lh是一个很好的聚类?视觉上很容易。我正在尝试使用查看数据和树形图的方法,但我收效甚微

编辑示例中的代码:

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,我认为{{1}}可与fcluster一起使用。但选择的阈值让我感到困惑。我会假设热图中高于阈值的值会聚集在一起吗?

2 个答案:

答案 0 :(得分:11)

虽然目前使用result.linkage.dendrogram_colresult.linkage.dendrogram_row,但它似乎是一个实现细节。最安全的方法是首先明确计算链接并将其传递给clustermap函数,该函数仅包含row_linkagecol_linkage参数。

使用以下代码替换示例中的最后一行(result = ...)会得到与之前相同的结果,但您还将拥有row_linkagecol_linkage个变量可以与fcluster等一起使用

from scipy.spatial import distance
from scipy.cluster import hierarchy

correlations = df.corr()
correlations_array = np.asarray(df.corr())

row_linkage = hierarchy.linkage(
    distance.pdist(correlations_array), method='average')

col_linkage = hierarchy.linkage(
    distance.pdist(correlations_array.T), method='average')

sns.clustermap(correlations, row_linkage=row_linkage, col_linkage=col_linkage, row_colors=network_colors, method="average",
               col_colors=network_colors, figsize=(13, 13), cmap=cmap)

在这个特定的例子中,代码可以更简化,因为相关数组是对称的,因此row_linkagecol_linkage将是相同的。

注意:之前的回答包括根据seaborn中的代码调用distance.squareshape,但is a bug

答案 1 :(得分:5)

您可能希望数据框中的新列具有群集成员资格。我已经设法通过从网络上窃取的代码片段来实现这一目标:

<lang:groovy id="func">
    <lang:inline-script>
        <![CDATA[
                import java.util.function.Function
                { text -> "Hello " + text } as Function
        ]]>
    </lang:inline-script>
</lang:groovy>

<bean id="foo" class="demo.services.Foo">
    <constructor-arg name="task" ref="func"/>
</bean>

因此,这会为您提供一个包含&#39; g&#39;或者&#39; r&#39;用于绿色或红色标记的簇。我通过绘制树形图来确定我的color_threshold,并注视y轴值。