传递距离矩阵给 seaborn 的 clustermap 函数

4
我想把自己的距离矩阵(行链接)传递给 seaborn clustermap。
已经有一些帖子介绍了这个问题,例如: 在scipy.cluster.hierarchy.linkage()中使用距离矩阵? 但它们都指向了 scipy hierarchy linkage 该函数需要聚类度量和方法作为参数。
scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean', optimal_ordering=False)
输入 y 可以是一个压缩的距离矩阵或一个观测向量的二维数组。
我不理解的是:
我的距离矩阵已经基于特定的度量和方法,那么我为什么要在 scipy hierarchy linkage中重新计算呢? 是否有选项可以纯粹使用我的距离并创建链接?

你说linkage“以聚类度量和方法作为参数”。再看一下文档字符串;linkage还接受预先计算的距离,但它们必须表示为“压缩”的距离矩阵(这只是一个包含距离矩阵中非冗余数据的1-d数组)。如果将压缩的距离矩阵传递给linkage,则忽略度量参数。然后再看一下你链接的第一个问题,它回答了你的问题。 - Warren Weckesser
1个回答

4
为了后代,这里提供一个完整的方法来完成此操作,因为评论中的@WarrenWeckesser和链接答案中的@SibbsGambling留下了一些细节。
假设`distMatrix`是您的距离矩阵(不必为欧几里德距离),其中行`i`和列`j`中的条目表示第`i`个和第`j`个对象之间的距离。然后:
# import packages
from scipy.cluster import hierarchy
import scipy.spatial.distance as ssd
import seaborn as sns

# define distance array as in linked answer
distArray = ssd.squareform(distMatrix) 

# define linkage object
distLinkage = hierarchy.linkage(distArray)

# make clustermap
sns.clustermap(distMatrix, row_linkage=distLinkage, col_linkage=distLinkage)

注意,在创建 clustermap 时,您仍需要引用原始矩阵。如果您想使用不同的聚类方法,例如 method='ward',请在定义 distLinkage 时包括该选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接