sed*_*idw 19 python cluster-analysis hierarchical-clustering dendrogram seaborn
我正在使用它seaborn clustermap创建集群,在视觉上它工作得很好(这个例子产生非常相似的结果).
但是,我无法弄清楚如何以编程方式提取集群.例如,在示例链接中,我怎么能发现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)
Run Code Online (Sandbox Code Playgroud)
如何从哪些模型中拉出哪些模型result?
EDIT2 将result不会与它携带linkage与在dendrogram_col我认为会一起工作fcluster.但选择的阈值让我感到困惑.我会假设热图中高于阈值的值会聚集在一起吗?
Mar*_*l M 15
在使用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)
Run Code Online (Sandbox Code Playgroud)
在该特定示例中,代码可以被更简化,因为相关阵列是对称的并且因此row_linkage并且col_linkage将是相同的.
注意:之前的答案包括distance.squareshape根据seaborn中的代码调用,但这是一个错误.
您可能希望数据框中的新列具有集群成员资格.我已经设法通过从整个网络上窃取的代码片段来实现这一点:
import seaborn
import scipy
g = seaborn.clustermap(df,method='average')
den = scipy.cluster.hierarchy.dendrogram(g.dendrogram_col.linkage,
labels = df.index,
color_threshold=0.60)
from collections import defaultdict
def get_cluster_classes(den, label='ivl'):
cluster_idxs = defaultdict(list)
for c, pi in zip(den['color_list'], den['icoord']):
for leg in pi[1:3]:
i = (leg - 5.0) / 10.0
if abs(i - int(i)) < 1e-5:
cluster_idxs[c].append(int(i))
cluster_classes = {}
for c, l in cluster_idxs.items():
i_l = [den[label][i] for i in l]
cluster_classes[c] = i_l
return cluster_classes
clusters = get_cluster_classes(den)
cluster = []
for i in df.index:
included=False
for j in clusters.keys():
if i in clusters[j]:
cluster.append(j)
included=True
if not included:
cluster.append(None)
df["cluster"] = cluster
Run Code Online (Sandbox Code Playgroud)
因此,这为绿色或红色标记的簇提供了一个带有"g"或"r"的列.我通过绘制树形图来确定我的color_threshold,并注视y轴值.
| 归档时间: |
|
| 查看次数: |
12199 次 |
| 最近记录: |