chore: 初始化 MCM/ICM Toolkit 仓库骨架
审查并精简 ChatGPT 的建库建议后落地的第一版骨架,只定接口不写实现。 - 建议审查:14 个包 → 7 个;约 250 个函数 → 约 40 个;5 个 Result 类 → 1 个 (docs/01-suggestion-review.md) - docs/:架构、路线图(含永久不做清单)、环境、Git 工作流、函数卡片模板 - src/mcm_toolkit/:core / data / stats / models / solve / decision / viz 共 23 个模块,均为签名 + docstring + NotImplementedError - tests/:9 个文件,其中 test_api_surface.py 已通过(20 passed) - examples/ problems/ notebooks/ figures/ tables/ 骨架 - pyproject.toml(核心依赖 4 个 + 6 组 extras)、environment.yml - scripts/:setup-venv.ps1(ASCII + LF)、setup-conda.ps1、doctor.ps1 - 环境:.venv(system-site-packages)与 conda 环境 mcm-toolkit 均已建好, 数值栈版本与 base 完全对齐(numpy 2.4.6 / scipy 1.18.1 / pandas 3.0.6,MKL 后端)
This commit is contained in:
commit
5319589dfd
76 files changed
+6812
No files matched your search
@@ -0,0 +1,137 @@
|
||||
# S 档「函数卡片」模板
|
||||
|
||||
> **只给 S 档用**(约 15 个招牌算法,见 `docs/03-roadmap.md` §3.1)。
|
||||
> 其余 A 档函数只要求 docstring 一句话 + 一条 pytest,不写卡片。
|
||||
>
|
||||
> 卡片写在哪:`docs/algorithms/<函数名>.md`。
|
||||
> 为什么写:S 档是自己实现、以后会去改内部实现的算法,
|
||||
> 卡片是"半年后还看得懂当时为什么这么写"的唯一保障。
|
||||
|
||||
---
|
||||
|
||||
## 卡片模板
|
||||
|
||||
```markdown
|
||||
# <函数名>
|
||||
|
||||
| 项 | 内容 |
|
||||
|---|---|
|
||||
| 模块 | `mcm_toolkit.<包>.<模块>` |
|
||||
| 档位 | S |
|
||||
| 参考来源 | <教材 / 论文 / 库;自己实现时参考了什么> |
|
||||
|
||||
## 1. 数学定义
|
||||
|
||||
<公式。用 LaTeX 写,例如 \`\\hat{\\theta}^* = \\arg\\min_\\theta ...\`。
|
||||
一句话说清输入输出分别是什么数学对象。>
|
||||
|
||||
## 2. 适用场景
|
||||
|
||||
**用**:<什么题型、什么数据条件下该用它>
|
||||
**不用**:<什么条件下它失效或不该用>
|
||||
|
||||
## 3. 参数与返回值
|
||||
|
||||
| 参数 | 类型 | 默认 | 含义 | 取值影响 |
|
||||
|---|---|---|---|---|
|
||||
| | | | | |
|
||||
|
||||
返回 `Result`:
|
||||
|
||||
| 字段 | 内容 |
|
||||
|---|---|
|
||||
| `params` | |
|
||||
| `metrics` | |
|
||||
| `data` | |
|
||||
|
||||
## 4. 复杂度
|
||||
|
||||
- 时间:`O(...)`
|
||||
- 空间:`O(...)`
|
||||
- **什么时候会跑不完**:<给出具体数字量级,例如"n > 1e6 时内存 8GB 打不住">
|
||||
|
||||
## 5. 数值稳定性
|
||||
|
||||
<浮点误差、除零、log(0)、上溢下溢、病态矩阵……
|
||||
写清"什么输入会出问题"和"代码里怎么防的"。>
|
||||
|
||||
## 6. 常见错误
|
||||
|
||||
1. <错误用法> → <后果> → <正确做法>
|
||||
2. …
|
||||
|
||||
## 7. 最小示例
|
||||
|
||||
```python
|
||||
# 能直接复制进 notebook 跑通的 5~15 行
|
||||
```
|
||||
|
||||
## 8. 单元测试要点
|
||||
|
||||
| 测什么 | 期望 |
|
||||
|---|---|
|
||||
| <已知解析解> | <精度要求> |
|
||||
| <边界输入> | <行为> |
|
||||
|
||||
## 9. MCM/ICM 用法
|
||||
|
||||
- **哪类题**:<例如"评价类 / 预测类 / 优化类">
|
||||
- **论文里怎么表述**:<一句话,能直接改写成论文的"方法"小节>
|
||||
- **图**:<配哪张图,用哪个 `viz` 函数>
|
||||
- **踩坑提醒**:<评审最可能质疑什么>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 示例:`bootstrap_ci` 的卡片(示范,未定稿)
|
||||
|
||||
```markdown
|
||||
# bootstrap_ci
|
||||
|
||||
| 项 | 内容 |
|
||||
|---|---|
|
||||
| 模块 | `mcm_toolkit.stats.bootstrap` |
|
||||
| 档位 | S |
|
||||
| 参考来源 | Efron (1979); Efron & Tibshirani (1993) *An Introduction to the Bootstrap* |
|
||||
|
||||
## 1. 数学定义
|
||||
|
||||
给定样本 \`x_1..x_n\` 与统计量 \`T(·)\`,从 \`x\` 中有放回抽 \`n\` 个得到 \`x^*\`,
|
||||
重复 \`B\` 次得 \`T^*_1..T^*_B\`。百分位法区间为
|
||||
\`[T^*_{(α/2·B)}, T^*_{(1-α/2)·B}]\`。
|
||||
|
||||
## 2. 适用场景
|
||||
|
||||
**用**:统计量没有解析分布(中位数、极差、自定义指标)、样本有偏、想给区间但不想假设正态。
|
||||
**不用**:\`n < 10\`(经验分布不可靠);数据有强时间相关性时(要用 block bootstrap)。
|
||||
|
||||
## 3. 参数与返回值
|
||||
|
||||
| 参数 | 类型 | 默认 | 含义 | 取值影响 |
|
||||
|---|---|---|---|---|
|
||||
| `statistic` | callable | `np.mean` | 任意 `f(sample) -> float` | 换 `np.median` 就得到中位数的 CI |
|
||||
| `n_resamples` | int | 10000 | 重采样次数 `B` | 越大区间端点越稳;10000 通常够 |
|
||||
| `confidence` | float | 0.95 | 置信水平 | |
|
||||
| `method` | str | `"percentile"` | `"percentile"` / `"bca"` | BCa 更准但慢 |
|
||||
|
||||
## 4. 复杂度
|
||||
|
||||
时间 \`O(B·n)\`;空间 \`O(B)\`(**按块处理,不落地 B×n 矩阵**)。
|
||||
`n=1e6, B=1e4` 约 \`1e10\` 次操作 → **跑不完**,此时应改用解析近似或降 `B`。
|
||||
|
||||
## 7. 最小示例
|
||||
|
||||
\`\`\`python
|
||||
import numpy as np
|
||||
from mcm_toolkit.stats import bootstrap_ci
|
||||
r = bootstrap_ci(heights, statistic=np.median, n_resamples=10000, random_state=42)
|
||||
print(r.params["low"], r.params["high"])
|
||||
\`\`\`
|
||||
|
||||
## 9. MCM/ICM 用法
|
||||
|
||||
- **哪类题**:任何要"给结论 + 给不确定性"的题,尤其评价类和预测类。
|
||||
- **论文里怎么表述**:"采用非参数 bootstrap(B=10000,seed=42)估计中位数的 95% 置信区间。"
|
||||
- **图**:预测曲线 + 阴影区间;用 `viz.plot`。
|
||||
- **踩坑提醒**:必须报 `B` 和 seed;BCa 与 percentile 结果不同时要说明选了哪个及理由。
|
||||
```
|
||||
Reference in new issue
Block a user