如果您在Python中使用scipy进行此分层聚类调用:
from scipy.cluster.hierarchy import linkage
# dist_matrix is long form distance matrix
linkage_matrix = linkage(squareform(dist_matrix), linkage_method)
Run Code Online (Sandbox Code Playgroud)
那么从单个点到集群分配的有效方法是什么?即一个长度的矢量,N其中N是点的数量,其中每个条目i是点的簇数i,给定在给定的聚类上由给定阈值thresh生成的聚类数?
澄清一下:群集号将是在向树应用阈值后所处的群集.在这种情况下,您将为其所在的集群的每个叶节点获得一个唯一的集群.从某种意义上说,每个点都属于一个"最具体的集群",它由您剪切树形图的阈值定义.
我知道这scipy.cluster.hierarchy.fclusterdata会给你这个集群赋值作为它的返回值,但我从自定义距离矩阵和距离度量开始,所以我不能使用fclusterdata.问题归结为:我如何计算什么fclusterdata是计算 - 集群分配?
我正在使用它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(), …Run Code Online (Sandbox Code Playgroud) python cluster-analysis hierarchical-clustering dendrogram seaborn