mcpField
A
algo-rank-elo

algo-rank-elo

github.com/asgard-ai-platform数据与数据库24337 次安装21 周前更新
代码仓库

关于 algo-rank-elo

用于根据两两比较结果为参与者或项目排名的 Elo 评分技能,说明评分更新、数据校验和结果验证,并提供单场或批量计算脚本。

主要功能

  1. 01根据两两结果更新评分
  2. 02支持胜负与平局
  3. 03通过 K 因子调整评分变化
  4. 04验证评分变化的零和性
  5. 05执行单场或批量更新

适用场景

  1. 01依据比赛结果为选手排名
  2. 02通过两两偏好为项目评分
  3. 03利用众包比较评估质量

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/asgard-ai-platform/skills --skill algo-rank-elo

安装后在 Claude Code 中输入/algo-rank-elo确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

examples/
sample_input.json
references/
bradley-terry.md
variable-k.md
scripts/
elo.py

详细介绍

Elo 评分系统

概述

Elo 会为每个参与者分配数值评分,并在每次两两比较后更新。获胜者加分,失败者扣分。分数变化取决于预期结果与实际结果。该系统最初用于国际象棋,如今也用于体育、游戏和 A/B 偏好测试。每场比赛的更新复杂度为 O(1)。

适用场景

触发条件:

  • 根据两两比较数据(A 与 B 的结果)为项目排名
  • 为游戏或体育赛事构建竞争性评分系统
  • 通过两两偏好众包评估质量

不适用场景:

  • 只有绝对分数而非两两比较结果时(使用直接排名)
  • 团队动态比个人技能更重要时(使用 TrueSkill)

算法

IRON LAW: Elo Assumes Each Matchup Is Independent and Stationary
Rating changes are based on surprise: beating a higher-rated opponent
gains more points than beating a lower-rated one. K-factor controls
update speed: high K (32) = volatile, fast adaptation. Low K (16) =
stable, slow adaptation. Choose K based on how quickly skill changes.
阶段 1:输入验证

将所有参与者的初始评分设为基准分(通常为 1500)。收集比赛结果:获胜者、失败者(或平局)。 关卡: 比赛数据有效,且不存在参与者与自身比赛的情况。

阶段 2:核心算法
  1. 预期得分:E_A = 1 / (1 + 10^((R_B - R_A)/400))
  2. 实际得分:S_A = 1(获胜)、0.5(平局)、0(失败)
  3. 更新:R_A_new = R_A + K × (S_A - E_A)
  4. 按顺序处理所有比赛(对于顺序 Elo,处理顺序很重要)
阶段 3:验证

检查:总评分分值守恒(零和)。评分分布合理(数据错误不会造成极端值)。 关卡: 评分守恒,排名靠前的项目通过合理性检查。

阶段 4:输出

返回按评分排序的结果,并附带置信度指标。

输出格式

{
  "ratings": [{"id": "player_A", "rating": 1720, "matches": 50, "wins": 35, "losses": 15}],
  "metadata": {"k_factor": 32, "initial_rating": 1500, "total_matches": 500}
}

示例

示例输入/输出

输入: 玩家 A(1500)战胜玩家 B(1500),K=32 预期: E_A = 0.5,S_A = 1。R_A_new = 1500 + 32×(1-0.5) = 1516。R_B_new = 1484。

边界情况
输入预期结果原因
1500 分者战胜 2000 分者评分大幅上升(K=32 时约增加 29 分)爆冷,结果令人意外
2000 分者战胜 1500 分者评分小幅上升(K=32 时约增加 3 分)结果符合预期,意外程度很低
同分者之间平局无变化预期结果与实际结果完全一致

注意事项

  • K 因子选择:过高会导致评分波动;过低则无法及时反映实际技能变化。可采用可变 K:新参与者使用较高值,资深参与者使用较低值。
  • 顺序依赖:顺序 Elo 评分取决于比赛的处理顺序。批量处理时,使用迭代 Elo 或 Bradley-Terry 模型。
  • 评分通胀/通缩:在参与者不断加入或离开的开放系统中,平均评分可能会漂移。可设置评分下限或定期校准。
  • 并非为团队设计:标准 Elo 面向 1 对 1 比赛。对于团队,可计算团队平均评分,或使用能对团队中个人贡献建模的 TrueSkill。
  • 评分 ≠ 获胜概率:评分差 200 分意味着预期获胜率约为 76%,但实际结果还取决于环境、状态和运气。

脚本

脚本描述用法
scripts/elo.py更新 Elo 评分(单场比赛或批量处理),并验证零和性质python scripts/elo.py --help

运行 python scripts/elo.py --verify 可执行内置的合理性测试。

参考资料

  • Bradley-Terry 模型(批量 Elo),参见 references/bradley-terry.md
  • 可变 K 因子策略,参见 references/variable-k.md

评论

支持 Markdown