当前位置: 首页 > news >正文

RRF (Reciprocal Rank Fusion) 排序算法详解

Reciprocal Rank Fusion (RRF) 算法,它是一种用于合并多个排名列表的方法。下面我将详细解释这个算法的工作原理和实现细节。

算法概述

RRF 是一种简单但有效的排名融合技术,它通过将多个排名列表中的项目位置进行加权组合,生成一个统一的排名。它的主要特点是:

  1. 不需要预先知道各个排名列表的质量

  2. 对排名靠前的项目给予更高的权重

  3. 对异常值有较好的鲁棒性

算法参数

  • lists: 一个包含多个排名列表的列表,每个子列表都是一个有序的项目集合

  • k: 一个常数,用于控制低排名项目的贡献(默认值为60)

算法步骤详解

1. 初始化分数字典

rrf_scores = {}

创建一个空字典来存储每个项目的累积分数。

2. 遍历每个排名列表

for rank_list in lists:

对于输入的每一个排名列表进行处理。

3. 遍历列表中的每个项目

for rank, item in enumerate(rank_list, start=1):

使用 enumerate 遍历列表中的每个项目,rank 从1开始表示项目在当前列表中的位置。

4. 计算并累加RRF分数

if item in rrf_scores:rrf_scores[item] += 1 / (k + rank)
else:rrf_scores[item] = 1 / (k + rank)

对于每个项目,计算其RRF分数并累加:

  • 如果在多个列表中出现,分数会累加

  • RRF分数计算公式:1 / (k + rank)

    • rank 是项目在当前列表中的位置(从1开始)

    • k 是常数,用于控制低排名项目的贡献

5. 按分数排序

sorted_items = sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True)

将所有项目按照累积的RRF分数从高到低排序。

6. 格式化输出结果

result = [{"score": score, "document": item, "index": i} for i, (item, score) in enumerate(sorted_items) if item]

将排序后的结果转换为字典列表,每个字典包含:

  • score: 项目的RRF分数

  • document: 项目本身

  • index: 项目在最终排名中的位置

算法特点

  1. 排名靠前的项目权重更大:由于使用倒数函数,排名越靠前(rank越小),贡献的分数越大

  2. 参数k的作用

    • 较大的k值会减小不同排名间的分数差异

    • 较小的k值会放大高排名项目的优势

    • 默认值60是一个经验值,可以根据具体场景调整

  3. 多列表融合:如果一个项目在多个列表中排名靠前,它的总分将更高

示例说明

假设有两个排名列表:

  • 列表1: ["A", "B", "C"]

  • 列表2: ["B", "A", "D"]

计算过程(k=60):

列表1:

  • A: 1/(60+1) ≈ 0.0164

  • B: 1/(60+2) ≈ 0.0161

  • C: 1/(60+3) ≈ 0.0159

列表2:

  • B: 1/(60+1) ≈ 0.0164

  • A: 1/(60+2) ≈ 0.0161

  • D: 1/(60+3) ≈ 0.0159

累加结果:

  • A: 0.0164 + 0.0161 ≈ 0.0325

  • B: 0.0161 + 0.0164 ≈ 0.0325

  • C: 0.0159

  • D: 0.0159

最终排序可能是[A, B, C, D]或[B, A, C, D](取决于具体实现)

应用场景

RRF常用于:

  • 搜索引擎结果融合

  • 推荐系统多策略结果合并

  • 任何需要合并多个排名列表的场景

这种方法的优势在于它简单有效,不需要训练数据,且对各个输入列表的质量不敏感。

具体代码如下:

def rrf_rescore(lists: list, k=60):rrf_scores = {}for rank_list in lists:for rank, item in enumerate(rank_list, start=1):if item in rrf_scores:rrf_scores[item] += 1 / (k + rank)else:rrf_scores[item] = 1 / (k + rank)sorted_items = sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True)result = [{"score": score, "document": item, "index": i} for i, (item, score) in enumerate(sorted_items) if item]return resultif __name__ == "__main__":lists = [["a", "b", "c", "d"],["b", "c", "e"],["c", "f"],["a", "c", "g"]]k = 60result = rrf_rescore(lists, k)print(result)

运行结果:

 

http://www.dtcms.com/a/266216.html

相关文章:

  • 【排序算法】
  • Vue3封装动态Form表单
  • 第二章-AIGC入门-开启AIGC音频探索之旅:从入门到实践(6/36)
  • 【学术写作+AI实战】株洲高校科研写作研修班全纪实:核心期刊编辑与AI专家的联合授课笔记
  • Web前端数据可视化:ECharts高效数据展示完全指南
  • 【JavaEE】计算机工作原理
  • JavaEE初阶第七期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(五)
  • 运维打铁:企业云服务解决方案
  • openEuler 24.03 全流程实战:用 Ansible 5 分钟部署分布式 MinIO 高可用集群
  • Django+DRF 实战:从异常捕获到自定义错误信息
  • 深度分析:Microsoft .NET Framework System.Random 的 C++ 复刻实现
  • 切出idea窗口自动编译,关闭idea自动编译
  • WPF+HelixToolkit打造炫酷自定义3D贴图立方体盒子模型
  • 机器学习在智能供应链中的应用:需求预测与物流优化
  • Java技术深潜:从并发陷阱到云原生突围
  • web网页,在线%电商,茶叶,商城,网上商城系统%分析系统demo,于vscode,vue,java,jdk,springboot,mysql数据库
  • 警惕 Rust 字符串的性能陷阱:`chars().nth()` 的深坑与高效之道
  • 「AI产业」| 《中国信通院华为:智能体技术和应用研究报告》
  • P1202 [USACO1.1] 黑色星期五Friday the Thirteenth
  • Ubuntu Linux Cursor 安装与使用一
  • 成功解决运行:Django框架提示:no such table: django_session
  • 基于探索C++特殊容器类型:容器适配器+底层实现原理
  • 如何通过注解(@Component 等)声明一个 Bean?Spring 是如何找到这些注解的?
  • java微服务(Springboot篇)——————IDEA搭建第一个Springboot入门项目
  • 【基础算法】贪心 (二) :推公式
  • 封装一个png的编码解码操作
  • 译码器Multisim电路仿真汇总——硬件工程师笔记
  • 嵌入式系统中实现串口重定向
  • 【模糊集合】示例
  • 【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案