# M2：五季英雄联动与克制研究

[English](README.en.md)

入口：项目根目录 `index.html` → M2 关系工作台。网页提供完整下路组合、上中对线、打野发育、跨路表现关联和共同选择倾向；中文、英文、浅色和深色共用 GitHub 现有 UI。M1、M3 的预测与系数不受修改。

## 收集范围

主范围 2022–2026，按当年顶级联赛成员清单筛选：LCK/LPL/LEC/LCS/LCP；2022–2024 沿用 PCS/VCS/LJL，2025 北美按 LTA North。至少一方符合则保留对手，保留国际赛和已完赛 DCGI，排除已确认盲选。2021 只提供历史候选英雄身份，不进入主性能训练。

`research/m2_five_seasons/manifest.json` 明确每年、时间点、来源和缺失覆盖。收录 13,657 局，包括23局 DCGI 补充资料；136,510 行选手统计；6 场缺完整选手统计。2 场名单／英雄来源冲突保留原记录，隔离所有关系训练与选择机会。2022–2024 主要为 Oracle's Elixir 原始职业统计，尚未完成所有历史场次 GoL 双源核验。

- `oe_all_fields.jsonl.gz`：所有原始 OE 列，含队伍行、原字段名和空值。
- `gol_all_cells.jsonl.gz`：已回收 GoL 全统计表的每个单元格，包括伤害类型、DPM、伤害占比、控制、治疗、护盾、视野等，不限分钟。
- `players.jsonl.gz`：角色、英雄、队伍、选手与标准数值，并分别保留 GoL 字段。GoL 百分数原单位保留，不把 GOLD% 当 OE 的 earnedgoldshare。
- `lane_observations.jsonl.gz`：10/15/20/25 分钟 CS／金币／经验差。空值不变为零；源数值争议只屏蔽对应指标，原值另留。
- `pick_opportunities.jsonl.gz`：可核验的 BP 顺序、当前不可用英雄、同队先前已锁英雄、规则和候选集合。

源库中的重复 ID 通过已核实的十角色别名链接映射；未核实重复不凭队名或游戏序号合并。两场已知 GoL 冲突重新下载后仍不一致，详见 `recovery_audit.json`。

## 三个独立问题

### 面向使用者的一个系数

对线主界面现在仅突出 **−1…+1 融合对位优势系数**，正值利于前一方、负值利于对手，0 附近均势。详细金币、补刀、经验和来源放在折叠区。这个系数不是胜率、胜率百分点或因果效果。

职业部分先扣除队伍／选手、实力、版本、红蓝方等背景，保留该英雄组合的对线结果，再用该指标的历史标准差统一单位。金币／补刀／经验初始权重为 45%／30%／25%；10／15／20／25 分钟权重为 40%／50%／7.5%／2.5%。同一场的多个指标合成一条证据，不当成多个独立样本；少样本向均势收缩。

排位部分使用扣除单英雄总体胜率后的对位整局胜率残差，作为次级证据。两种证据均有时默认职业 80%、排位 20%，再通过 tanh 映射到 −1…+1；没有排位时只用职业，有排位而无职业时保留衰减的排位提示并明确标记。下路只使用完整四英雄职业组合，不能相加两个单挑胜率。

这些融合权重和阅读分档是透明的初始工程设定，**尚不是用真实“克制系数标签”训练出的最优权重**。它满足简单评估与后续 M4 特征接口需求，不能声称新增了经过 S15 检验的准确率提升。`lane_coefficients.json` 提供每个有证据对阵的系数、分路、样本支持和分量，交换双方得到相反数。

### 1. 对线／发育

每个分路、时间点和指标单独拟合。打野统计是相对发育，不称为物理对线。

下路输入必须是 **ADC＋辅助 vs ADC＋辅助** 的四英雄有序组合。金币／经验合计两人；补刀主要显示 ADC，辅助补刀仍在玩家数据。模型包含两边单英雄基准、共享双人关系及四英雄整体残差，四英雄样本数和原始观测始终整体统计；不是两个单挑预测的相加。

背景含版本、赛季、赛事、BP 规则、局序、赛前 Elo 差／平均 Elo、队伍、选手和角色英雄基准。它控制已观测背景，无法消除实际换线、游走、打野介入等未观测混杂，所以仍为观察性关联。

### 2. 跨路表现关联

整局结果采用正则化 logistic 模型：单英雄背景＋蓝方同队关系减红方同队关系＋敌方有方向关系。角色是节点身份的一部分，不能混用同英雄不同位置。同队共现次数和未经调整的胜率不是效果。

直接关系项采用比主项更强的收缩。4 维低秩关系矩阵共享用于稀疏／未见组合，混合比例由历史职业选择集决定；其真实样本数仍为零。跨路“克制”表实际显示控制后的敌方表现关联，不声称因果。

另做 20 次完整系列赛 block bootstrap，每次重拟合背景及关系项，显示 5%–95% 稳定范围。这是有限次数重采样的稳定性诊断，不是因果效果置信区间。

### 3. 共同选择倾向

Classic 与 Full Fearless 使用独立的可用机会口径。全局 BP 排除该系列先前各局双方选过的英雄；当局排除此前锁定以及该阶段前已发生的禁用。规则、先前局历史或 BP 次序不能确认的系列不参与这一分母，但可以保留为表现资料。

期望概率来自严格前一天的 45 天衰减角色热度、队伍、版本、模式、红蓝方和赛前实力背景，比较实际加权选择与期望选择，用平滑 log lift 表示超额倾向。机会池是此前已在职业相同角色出现的候选，并非完整官方合法英雄池；官方临时禁用名单未恢复。它不等于即时 BP 概率，也不等于战斗联动。

这些背景频率也按 BP 模式各自累计，不拿 Classic 或规则不明的原始选取率填入全局 BP 的期望概率。跨时代共享的是英雄角色身份和表现关系先验，而不是直接比较赛制间 BP 率。

## 权重与验证

结构关系权重沿用先前的比赛重要度、赛前实力、赛事规模平衡和首局提升形式：

```text
2^(-距数据截止日/half_life) × exp(-0.01×标准化版本距离)
× 赛事重要度 × exp(0.8×clip((赛前平均Elo−1500)/400,−1,1))
× 赛事比赛数^(-0.25) × (首局1.4，否则1)
```

世界赛 2、MSI 1.8、EWC 1.4、First Stand 1.3、资格赛 1.45、季后赛 1.35、德杯／KeSPA 0.75、升降级 0.4、常规 1。Elo 使用此前已结束且早于本日的结果，赛季重置到区域先验，K=20。同一天的当前／后续赛果不进入 Elo。

关系模型为利用稀疏历史，将半衰期候选设为 45／365／730 天，并使用较缓的结构版本衰减。**没有改动 M1 的近期权重或版本影响模块**。样本量同时显示真实 N 和 Kish ESS，老比赛不是与近期等权。

按整系列划分：训练到 2025-06-30；7 月至 9 月 14 日选择模型；9 月 15 日至 10 月 13 日校准预测区间；S15 世界赛 84 局回溯测试。冻结选择后再用 2026 年 7 月以后测试，最终拟合使用截至快照的已完赛资料。不能称为全新前瞻盲测。20／25 分钟标签只覆盖具有相应观测的比赛，条件样本和误差不得当作所有比赛的无条件平均。

报告保存全部候选、MAE、RMSE、log loss、Brier、预测区间覆盖率和已单独调参的主效应基线。额外关系项没有在所有指标上胜过基线，不能承诺整体准确率大幅提高。

## 排位校准

历史 KR Challenger-seeded 数据有 2,493 场完整阵容、7,479 行上／中／完整双人路时间点；参与者不保证逐人大师以上。对相同单位的真实早期统计试验 0／0.05／0.2 权重，职业时间切分选择，不把排位伪装成职业场次。

当前 OP.GG KR Master+ 26.20 有 255 个英雄／角色接口、2,925 条方向记录。它只有整局胜率，不能转换成 CS／金币／经验差。先扣除排位单英雄基准再做整局结果的敏感性校准，展示其单独影响。两个方向可能重叠，只取较高支持方向，不相加比赛数。当前参考没有完整四英雄下路，不能拼接两场单挑代替。

当前排位不进入 S15 或 2026 历史测试；历史 KR 结果迁移到当前 Master+ 的校准幅度只可解读为敏感性估计。当前整局结果校准在历史选择上的增益很小，不能声称已充分验证跨人群、跨版本迁移。

## 复现

Python 3.11+，NumPy、SciPy；从项目根目录运行。先恢复现有冻结原始数据包（沿用仓库下载／哈希工具），输入路径及 SHA 在 manifest 中。公开 OP.GG 快照已由仓库提供。

```bash
python -m models.relationships.m2_rebuild.collect
python -m models.relationships.m2_rebuild.recover
python -m models.relationships.m2_rebuild.prepare
python -m models.relationships.m2_rebuild.opportunities
python -m models.relationships.m2_rebuild.train
python -m models.relationships.m2_rebuild.bootstrap
python -m models.relationships.m2_rebuild.lane_coefficient
python -m models.relationships.m2_rebuild.report
python -m models.relationships.m2_rebuild.export
python tools/build_unified_results.py
python tools/check_m2_rebuild.py
node tools/test_m2_query.cjs
```

网络采集只访问公开页面，限速、缓存、保留哈希；401／403／429 停止，不绕过。`recover` 可保留未解决的源冲突而不终止整个流程。输出大数据在本地／独立数据包保存；模型 JSON、报告、源码和审计文件适合仓库。`fitted.pkl.gz` 只是可重建本地缓存，不加载未经信任的 pickle。

方法参考：[SIDO](https://arxiv.org/abs/2403.04873) 的自身／队友／对手背景分解；[职业地图配对比较研究](https://arxiv.org/abs/2609.08060) 的赛前实力与时间验证；[BPGG](https://bpgg.app/en/about) 仅参考关系浏览思路，没有把其原始胜率当作因果真值。

## 赛前三个月的队伍优势线优先级

运行 `python -m models.relationships.m2_rebuild.team_lane_priority`，然后 `python tools/check_team_lane_priority.py`。独立生成 `results/team_lane_priorities.html`、根目录 `team_lane_priorities.txt` 和 `artifacts/team_lane_priority/` 的完整逐局证据、分层、排序与审计；不会改变 M1/M3 或当前对位表。

S15 窗口为 2025-07-14 至 10-14 开赛前，S16 为 2026-07-15 至 10-15 开赛前。队伍名单沿用已核验参赛清单，别名合并；LPL 资格赛不因为来源标记 WLDs 而获得世界赛权重。仅使用每届开赛前已完成的记录。S16 现有记录截至 10-14，不推测未录入比赛；FURIA、LOS、S15 VKS 在原收录范围内只有少量国际赛，暂不能代表全部国内赛。

职业 10/15 分钟金币／补刀／经验差构成对位系数，指标混合为 .45/.30/.25，时间混合为 .4/.9 与 .5/.9。整系列两折交叉拟合背景、同对阵统计排除被评价的整个系列，稀疏组合使用正则化的英雄／分路联合模型估计。下路始终为四英雄完整对阵，没有将两场独立排位单挑相加。排位仅使用 2025 年 3–4 月已存在的 KR Challenger-seeded 样本（非逐人确认 Master+），最大权重 .2 随参考年代以 365 天半衰期衰减；没有套入当前 26.20 排位表。

每局照顾量 = `.5*K + .25*max(K,0)*前三手完成 + .25*max(K,0)*第四/第五手且对手本单位已选完`。下路需要 ADC 和辅助全部确定；连续同方选取属于同一轮，不视为新反选信息。50 分为该分路在赛事／红蓝方／赛制／系列阶段背景下的相对基准，队伍得分按近期 45 天半衰期和 M2 赛事／实力／版本／首局权重加权，并以 ESS/(ESS+8) 收缩。未知赛制不当作 Classic；首局、后续局以及各已知规则独立留存。

这是透明的**描述性指数**，混合比例没有针对真实教练意图做最优训练，也不是胜率。系列重采样 400 次；相邻次序支持率低于 80% 用“≈”。重采样条件于对位系数，不涵盖全部模型误差。最终分路标签不保证 BP 时已识别摇摆，阵容目标、选手能力和版本优先级仍可能影响所见偏好。同窗口其他系列可参与回溯估计，不能当作逐日实时回测；S15/S16 各自居中，指数不是跨年强度尺度。
