Skip to content

fix(vutils): stabilize regression fits and add paired bootstrap - #291

Merged
xile611 merged 4 commits into
mainfrom
codex/stable-regression-bootstrap
Oct 9, 2026
Merged

xile611 merged 4 commits into
mainfrom
codex/stable-regression-bootstrap

Conversation

@xile611

@xile611 xile611 commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

🤔 这个分支是...

  • Bug fix
  • 新功能
  • Ts 类型更新
  • 测试 case 更新
  • 网站/文档更新

🔗 相关 issue 连接

暂无独立 issue。

💡 问题的背景&解决方案

现有线性/多项式回归在 x 有大偏移时可能返回错误的斜率或零预测,LOWESS 的 predict 与 evaluateGrid 没有使用同一份稳健拟合状态。使用原始样本生成回归曲线和残差时,两条路径因此会得到不同模型。

  • 共用中心化/缩放求解器:线性使用稳定中心矩,多项式使用增量 Givens QR;秩不足时采用固定基底的最小范数解,公开 rank,保留已有系数格式。
  • LOWESS 在构建时完成稳健迭代,predict、evaluateGrid、fitted 共用同一模型;局部坐标保留混合尺度下的精度,极值距离溢出时使用归一化坐标。重复 x、零核权重与 median=0 采用明确且可测试的规则。
  • 新增根导出 regressionBootstrap,完整 (x,y) 成对重采样,每次重新拟合一次;复用 randomLCG / quantileSorted,生成均值响应的逐点 percentile 置信带。退化抽样不删除、不重抽。
  • 网格保留整数步长,保持现有柱状回归组件按类别索引取值的调用方式。
  • 修复自动标签工作流的旧配置与新版 action 不兼容:迁移到 changed-files / any-glob-to-any-file,固定 actions/labeler v6.2.0 的提交,并覆盖嵌套测试目录。
  • 单测 CI 的 Rush 包级执行与 VUtils Jest worker 改为串行,避免性能预算测量时同时运行其他测试进程;保留全部单元/性能用例及原始 100/150/200ms 预算。
import { regressionLinear, regressionBootstrap } from '@visactor/vutils';
const data = [{ x: 0, y: 1 }, { x: 1, y: 3 }, { x: 2, y: 4 }, { x: 3, y: 7 }];
const curve = regressionLinear(data).evaluateGrid(100);
const bounds = regressionBootstrap(data, {
  method: 'linear', grid: curve.map(p => p.x), level: 0.95, resamples: 1000, seed: 0
});

📝 Changelog

Language Changelog
🇺🇸 English Stabilize linear/polynomial regression; unify robust LOWESS predictions and add explicit delta interpolation; add paired regression bootstrap confidence bands.
🇨🇳 Chinese 修复回归数值稳定性,统一 LOWESS 稳健预测,新增显式 delta 插值与成对 bootstrap 置信带。

行为调整: LOWESS 默认 span 从 0.3 改为 2/3,iterations 从 2 改为 3;取消默认 1000 样本截断及按 N 自动减少迭代。默认使用全量观测,精确路径存在 O(N²) 成本;大样本可显式选择 delta,maxSamples 的显式用途继续保留。稳健拟合在模型构建时完成,旧曲线和退化预测可能改变。不可表示的系数/结果和没有有效局部观测会明确报错。

既有 confidenceInterval API 保留;本 PR 没有将旧多项式/LOWESS 区间近似声称为新的 bootstrap CI,也没有修改包版本或执行发布。详细契约和迁移影响见 packages/vutils/REGRESSION.md,文档随 npm 包打包。

☑️ 自测

  • 文档提供了,或者更新,或者不需要:新增 REGRESSION.md 与调用示例。
  • Demo 提供了,或者更新,或者不需要:公共 API 调用示例随文档提供,无 UI 变更。
  • Ts 类型定义提供了,或者更新,或者不需要:随根导出生成声明,隔离消费严格类型检查通过。
  • Changelog 提供了,或者不需要:上表和行为调整说明。

验证使用 Node.js 22.23.3,基于最新 origin/main(5939197):

  • vutils compile/build 通过;ESLint 0 errors、8 条既有 warnings。
  • vutils 全量 53 套 / 276 项通过。含 11 组独立 NumPy/statsmodels 固定数值对照、大偏移、极值/混合尺度、秩不足抽样、确定性与模型一致性。
  • 数值对照仅提交固定 JSON 和 TypeScript 测试,不包含 Python 生成脚本,也不要求 Python 运行环境;清理脚本后 11 项固定数据对照测试重新通过。
  • 真实构建产物 LOWESS 性能测试通过,保留原 100/150/200ms 预算并验证全量节点;显式 delta 不删除观测。
  • 下游 StatPlots 全量 636 项单测及 18 项回归/性能/ESM 浏览器检查通过;现有 VChart Extension 散点三方法和柱状回归调用检查通过。
  • 本地打包隔离安装:CJS 编译 140 份下游主例/有效变体、严格 types、三模型 ESM/UMD 实际绘制与 release 通过;开发包没有源码 symlink。未将此联调结果视为 npm 已发布。
  • Labeler 使用固定 action 提交的官方解析器与匹配器验证:复现旧配置错误,23 个路径用例通过,除扩展测试目录范围外,其余规则在 582 个已跟踪文件上的匹配结果不变;YAML、action 提交与工作流权限检查通过。

此前并行单测运行中 LOWESS 墙钟预算断言失败;串行执行后,本地 Node.js 22.23.3 和 20.19.4 的 53 套 / 276 项均通过。提交 ee963ab 的 GitHub 单测任务 已通过:四个包合计 101 套 / 816 项,包含全部 LOWESS 性能预算断言;未跳过测试或放宽阈值。

GitHub 验证限制: Labeler 使用 pull_request_target,读取 main 的工作流与配置,合并前该 PR 的标签检查仍可能因旧配置失败。


🚀 Summary

copilot:summary

🔍 Walkthrough

copilot:walkthrough

@xile611
xile611 requested a review from 666haiwen October 9, 2026 09:02
@xile611
xile611 merged commit f963e37 into main Oct 9, 2026
5 of 6 checks passed
@xile611
xile611 deleted the codex/stable-regression-bootstrap branch October 9, 2026 09:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants