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

寻求可衡量因果发现方法排名相似度的Python可用指标

排名相似度量化方法与Python实现

针对你验证因果发现方法基准结果的需求,以下是几种适用于对比两个排名相似度的量化指标,附Python实现代码:

核心指标选择

  • 斯皮尔曼等级相关系数:衡量两个排名的单调关联程度,结果范围[-1, 1]。1表示排名完全一致,-1表示完全反向,0表示无关联,适合评估整体趋势的一致性。
  • 肯德尔tau系数:基于配对样本的一致/不一致对统计,同样范围[-1,1],对小样本(比如你这里的3种方法)稳定性更好。
  • 秩次差平方和:计算对应位置排名的差值平方总和,数值越小说明排名越相似,直观反映差异大小。

实现步骤与代码

首先需要根据指标的优劣方向生成排名:

  • SHD、FDR:数值越小性能越好,排名1给最小的结果;
  • TPR:数值越大性能越好,排名1给最大的结果。

以下代码适配你的示例数据,包含同分处理(比如你的TPR中GES和PC得分相同):

import numpy as np
from scipy.stats import spearmanr, kendalltau

# 论文结果(方法顺序:LiNGAM, GES, PC)
paper_data = {
    'shd': [35.00, 44.00, 64.00],
    'tpr': [0.37, 0.70, 0.80],
    'fdr': [0.32, 0.55, 0.63]
}

# 自己的实验结果
my_data = {
    'shd': [28.00, 13.00, 16.00],
    'tpr': [0.00, 0.65, 0.65],
    'fdr': [1.00, 0.42, 0.56]
}

# 生成排名:支持同分平均排名,根据指标优劣方向调整排序
def generate_ranks(scores, higher_is_better):
    sorted_idx = np.argsort(scores)
    # 按优劣方向反转排序索引
    if higher_is_better:
        sorted_idx = sorted_idx[::-1]
    ranks = np.zeros(len(scores))
    # 初始分配排名
    for rank, idx in enumerate(sorted_idx, 1):
        ranks[idx] = rank
    # 处理同分,替换为平均排名
    for score in np.unique(scores):
        mask = scores == score
        rank_count = np.sum(mask)
        avg_rank = np.mean(ranks[mask])
        ranks[mask] = avg_rank
    return ranks

# 逐个指标计算相似度
for metric in ['shd', 'tpr', 'fdr']:
    # 确定当前指标的优劣方向
    better_higher = metric == 'tpr'
    # 生成两个排名序列
    paper_ranks = generate_ranks(paper_data[metric], better_higher)
    my_ranks = generate_ranks(my_data[metric], better_higher)
    
    # 计算三种相似度指标
    spearman, _ = spearmanr(paper_ranks, my_ranks)
    kendall, _ = kendalltau(paper_ranks, my_ranks)
    squared_diff_sum = np.sum((paper_ranks - my_ranks)**2)
    
    # 输出结果
    print(f"--- 指标:{metric} ---")
    print(f"论文排名:{paper_ranks.round(2)}")
    print(f"我的排名:{my_ranks.round(2)}")
    print(f"斯皮尔曼相关系数:{spearman:.4f}")
    print(f"肯德尔tau系数:{kendall:.4f}")
    print(f"秩次差平方和:{squared_diff_sum:.2f}\n")

代码说明

  1. generate_ranks函数自动处理同分情况,给得分相同的方法分配平均排名(比如你的TPR中GES和PC都会得到1.5名);
  2. 针对不同指标的性能逻辑(越大越好/越小越好)自动调整排序方向,确保排名生成准确;
  3. 输出的三种指标可以互补使用:系数类指标看趋势一致性,平方和看具体差异大小。

额外提示

  • 小样本场景下优先参考肯德尔tau系数;
  • 如果需要综合多个指标的相似度,可以对单个指标的相似度结果加权平均;
  • 依赖的scipy库可通过pip install scipy安装。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:35:07