我正在使用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一起使用。但选择的阈值让我感到困惑。我会假设热图中高于阈值的值会聚集在一起吗?
答案 0 :(得分:11)
虽然目前使用result.linkage.dendrogram_col
或result.linkage.dendrogram_row
,但它似乎是一个实现细节。最安全的方法是首先明确计算链接并将其传递给clustermap
函数,该函数仅包含row_linkage
和col_linkage
参数。
使用以下代码替换示例中的最后一行(result =
...)会得到与之前相同的结果,但您还将拥有row_linkage
和col_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_linkage
和col_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轴值。