mcpField
A
algo-rank-elo

algo-rank-elo

github.com/asgard-ai-platformデータ・データベース24337 回インストール21 週間前に更新
リポジトリ

algo-rank-elo について

ペア比較の結果から参加者や項目を順位付けするEloレーティングのスキルです。評価更新、入力検証、結果確認を説明し、単一試合と一括計算用のスクリプトを備えています。

主な機能

  1. 01ペア結果に基づくレーティング更新
  2. 02勝敗と引き分けへの対応
  3. 03Kファクターによる変動幅の調整
  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 を参照してください

コメント