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

如何将Presence/absence matrix(有无矩阵)转换为距离矩阵?

从有无矩阵生成距离矩阵

我明白你不想用有无矩阵绘制树状图,转而需要距离矩阵来设置阈值绘图的需求——这在分类分析、生物信息学这类场景里是非常常见的操作!针对你给出的二元有无矩阵,我们可以用专门的距离计算方法生成符合要求的对称距离矩阵,下面是具体的实现方案:

选择合适的距离度量

对于0/1类型的有无矩阵,最常用的两种距离度量是:

  • Jaccard距离:专门针对二元数据,计算逻辑是1 - (两个样本共同拥有的特征数)/(两个样本至少拥有一个的特征数),会自动忽略全0的特征(比如你的矩阵中C、I列全为0,这类特征不会影响计算结果),适合衡量"共同存在特征"的相似性。
  • Hamming距离:计算两个样本在所有特征位置上的差异比例,包含全0特征,更偏向于整体特征的匹配度。

Python代码实现

我们可以用pandas来处理数据,scipy来计算距离矩阵,代码直接可以复用:

1. 构建有无矩阵数据框

import pandas as pd
from scipy.spatial.distance import pdist, squareform

# 把你的有无矩阵转换成DataFrame
data = {
    'Names': ['name1', 'name2', 'name3', 'name4', 'name5'],
    'A': [1, 0, 1, 1, 0],
    'B': [1, 1, 0, 1, 1],
    'C': [0, 0, 0, 0, 0],
    'D': [1, 1, 1, 1, 1],
    'E': [1, 0, 1, 0, 1],
    'F': [1, 1, 0, 1, 0],
    'G': [1, 0, 1, 0, 1],
    'H': [1, 1, 1, 0, 1],
    'I': [0, 0, 0, 0, 0]
}
df = pd.DataFrame(data).set_index('Names')

2. 计算Jaccard距离矩阵

# 计算两两样本的Jaccard距离,再转成对称方阵
jaccard_dist_matrix = squareform(pdist(df, metric='jaccard'))
# 转换成带样本名称的DataFrame,保留两位小数
jaccard_dist_df = pd.DataFrame(jaccard_dist_matrix, index=df.index, columns=df.index).round(2)

print("Jaccard距离矩阵:")
print(jaccard_dist_df)

3. 计算Hamming距离矩阵(可选)

如果你需要包含全0特征的距离计算,替换成Hamming距离即可:

hamming_dist_matrix = squareform(pdist(df, metric='hamming'))
hamming_dist_df = pd.DataFrame(hamming_dist_matrix, index=df.index, columns=df.index).round(2)

print("\nHamming距离矩阵:")
print(hamming_dist_df)

结果说明

  • 运行代码后你会得到对称的距离矩阵,样本与自身的距离为0.00(这是距离矩阵的标准定义,你的示例中对角线为1.00应该是随便填写的数值)。
  • 如果你的实际需求是相似度矩阵(值越接近1越相似),只需要用1 - 距离矩阵转换即可,比如jaccard_sim_df = 1 - jaccard_dist_df。

内容的提问来源于stack exchange,提问作者F.Lira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:25:15