You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在aheatmap中基于已有相似性矩阵进行层次聚类并搭配热图?

解决aheatmap基于相似性矩阵聚类的问题

我明白你的困扰——aheatmap(来自NMF包)默认会对输入矩阵的行/列计算距离来做层次聚类,但你已经有了现成的相似性矩阵,想要直接基于这个矩阵的数值来聚类样本,同时和热图联动展示。下面是具体的解决步骤:

核心逻辑

层次聚类算法(比如hclust)本质依赖距离矩阵(值越大表示样本越不相似),而你的相似性矩阵是反向的(值越大表示越相似)。所以我们需要先把相似性矩阵转换成符合聚类要求的距离矩阵,再手动生成聚类树,最后传给aheatmap指定聚类规则。

具体实现代码

假设你已经有了对称的相似性矩阵sim_mat(行和列都是样本,矩阵值是样本间的相似性):

# 加载依赖包
library(NMF)
library(stats)

# 1. 将相似性矩阵转换为距离矩阵
# 注意:这里的转换方式要匹配你的相似性取值范围
# - 如果相似性是0~1范围(比如余弦相似性):
dist_mat <- as.dist(1 - sim_mat)
# - 如果相似性是-1~1范围(比如皮尔逊相关系数):
# dist_mat <- as.dist((1 - sim_mat)/2)

# 2. 基于自定义距离矩阵生成层次聚类树
# 聚类方法可以根据需求选择:ward.D2、complete、average等
hc <- hclust(dist_mat, method = "ward.D2")

# 3. 绘制热图并指定自定义聚类树
aheatmap(
  sim_mat,  # 你的相似性矩阵,作为热图展示内容
  Rowv = hc,  # 指定行聚类使用我们生成的树
  Colv = hc,  # 因为是对称矩阵,列聚类和行一致,也可以设为NA或其他
  scale = "none",  # 相似性矩阵不需要缩放
  main = "Similarity Matrix with Custom Hierarchical Clustering",
  color = colorRampPalette(c("white", "blue", "darkblue"))(100)  # 自定义热图颜色,可选
)

关键细节说明

  • Rowv和Colv参数:这两个参数接受预先生成的聚类树(hclust对象),这样aheatmap就不会再自动计算行/列的距离,而是直接使用你提供的聚类结果。
  • 距离转换的合理性:转换后的矩阵必须满足距离的基本性质(非负、对称、自距离为0),上面的两种转换方式都符合这个要求,能保证相似性越高的样本,在距离矩阵中值越小,聚类时会被优先合并。
  • 如果你的相似性矩阵取值范围特殊,可以调整转换公式,只要保证“相似→距离近”的逻辑即可。

这样就能实现基于你原有相似性矩阵的聚类,同时和热图完美联动展示了。

内容的提问来源于stack exchange,提问作者Keshav M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:36:04