Keplearn:数秒内从数据中提取方程的符号回归引擎
Keplearn: Extract Equations from Data in Seconds
Keplearn 是一个用 Rust 编写的确定性符号回归引擎,可从表格数据中恢复闭式方程,精确规律通常在毫秒级解出。在 SRBench 基准上,Feynman 数据集无噪声时符号解率达 64.7%,高于 AIFeynman 的 55.8%,且计算预算更小。工具读取 stdin 的 TSV/CSV,输出 JSON 候选方程,单二进制零依赖,采用 MIT 许可证。
秒级符号回归。
Keplearn 以 Johannes Kepler 命名,他通过研究 Tycho Brahe 记录的天文观测表推导出了行星运动定律。这个程序试图做的正是这件事:给定若干列测量数据,找出将它们联系起来的简洁定律。
m1 | m2 | r | force
------+-------+------+-------
1.0 | 2.0 | 1.0 | 2.00
2.0 | 2.0 | 2.0 | 1.00 ┌──────────┐
1.5 | 3.0 | 3.0 | 0.50 ──► │ keplearn │ ──► force = m1 * m2 / r**2
2.5 | 1.0 | 0.5 | 10.00 └──────────┘
3.0 | 4.0 | 2.0 | 3.00
更正式地说,它是一个确定性的符号回归引擎(用 Rust 编写),通过最佳优先的递归归约从表格数据中恢复闭式方程。
- 从标准输入读取 TSV 或 CSV,将候选方程以 JSON 形式打印
- 单一二进制文件,零依赖(使用 musl 目标时完全静态)
- 设计目标是在数秒内给出答案:精确定律通常在毫秒级解决,
--timeout则为困难情况设上限 - 确定性;相同输入产生逐字节相同的输出
- 报告的
r2由打印出的方程本身计算得出,绝不来自内部拟合阶段 - 拟合常数会吸附到有理数以及 pi、e 和 sqrt(2) 的倍数,每次吸附在保留前都会经过验证
下载
macOS(通用:Apple Silicon 和 Intel)
curl -L -o keplearn https://github.com/owls-on-wires/keplearn/releases/latest/download/keplearn-macos-universal chmod +x keplearn ./keplearn --help
Windows(PowerShell)
curl.exe -L -o keplearn.exe https://github.com/owls-on-wires/keplearn/releases/latest/download/keplearn-windows-x86_64.exe .\keplearn.exe --help
Linux(x86_64,完全静态)
curl -L -o keplearn https://github.com/owls-on-wires/keplearn/releases/latest/download/keplearn-linux-x86_64 chmod +x keplearn ./keplearn --help
用法
用 --target 指定要预测的列(默认是名为 target 的列),并通过管道传入带表头行的 TSV 或 CSV。分隔符由表头决定:有制表符则用制表符,否则用逗号。
$ ./keplearn --target force --top-k 1 --pretty --out laws.json < gravity.tsv $ cat laws.json { "results": [ { "expr": "((x1**(1))*(x2**(1))*(x3**(-2)))", "r2": 1.0000000000, "search_r2": 1.0000000000, "holdout_r2": 0.9999999999998754, "scale": 0.9999984680738088, "offset": 0.000011830325937959667, "columns": [ 0, 1, 2 ], "factor": "direct", "model": "((x1*x2)*((x3)**(-2)))" } ], "time_ms": 0, "n_expressions": 0, "n_evaluated": 0, "stopped_by": "exact_exit" }
x1..xN 是按文件顺序排列的特征列,不含目标列;此处 x1=m1、x2=m2、x3=r,因此恢复出的定律读作 m1*m2/r**2。候选按最佳优先顺序到达:results[0].model 是答案,其 r2 是在所提供数据上评分得到的。诊断信息打印到 stderr,因此 stdout 始终是一个 JSON 对象。
有用的标志:
./keplearn --target Tc --timeout 60000 < superconductors.csv # cap the search at 60 s ./keplearn --top-k 3 < data.tsv # emit the 3 best candidates ./keplearn --target y --sample 1000 < big.tsv # screen on more rows ./keplearn --help # full flag list and output schema
方法
引擎在应用于目标列的不可逆归约链上进行搜索:它除以一个拟合因子,反转诸如 log、sqrt 或 arcsin 之类的变换,拟合一个内部仿射节点,并以固定深度重复此过程。在每个节点上,它尝试用指数来自对数线性回归的仿射单项式、稀疏 k 项单项式,或一小组合成形式(L2 范数、有理式、三角函数)之一,对归约后的目标进行终端拟合。候选在内部 25% 留出集上以 MDL 复杂度惩罚进行排名。
拟合常数会吸附到附近的有理数以及 pi、e 和 sqrt(2) 的倍数。只有当验证过程显示模型在留出集和完整数据上仍能获得同样好的评分时,才会保留该吸附。然后获胜表达式会进行代数化简,针对完整数据集重新拟合比例和偏移,并重新评分。输出中的 r2 来自对打印出的模型字符串求值;它不会从任何内部拟合阶段沿用。
基准测试
Keplearn 是 SRBench 中的一种方法,这是标准的符号回归基准,通过 cavalab/srbench#223 加入。
这些数字来自 SRBench 自己的容器化流水线,由其 sympy 等价性检查评分,每个数据集一次试验,每次拟合 60 秒预算。按目标噪声划分的真值符号解率:
| 套件 | 噪声 0 | 0.001 | 0.01 | 0.1 |
|---|---|---|---|---|
| Feynman (116) | 75 (64.7%) | 65 (56.0%) | 51 (44.0%) | 10 (8.6%) |
| Strogatz (14) | 6 (42.9%) | 6 (42.9%) | 3 (21.4%) | 1 (7.1%) |
SRBench 上已发表的最高 Feynman 符号解率是 AIFeynman 的 55.8%,下一组接近 27%;Keplearn 仅用其计算预算的一小部分就达到了 64.7%。
在 138 个没有闭式真值的黑盒数据集上,测试 R2 的中位数接近零(约 -0.003)。Keplearn 的目标是精确的解析定律而非一般曲线拟合,这一结果反映了这种权衡。
在同样 60 秒上限下,每次拟合单核的拟合时间:
| 套件 | 中位数 | 均值 | max | 1 秒内完成 |
|---|---|---|---|---|
| Feynman,噪声 0 | 1.3 秒 | 13.3 秒 | 60.7 秒 | 55/116 |
| Feynman,噪声 0.001-0.1 | 11-14 秒 | 15-23 秒 | 60.7 秒 | 0/348 |
| Strogatz,所有噪声水平 | 1.3 秒 | 1.5 秒 | 3.6 秒 | 8/56 |
| 黑盒 | 60.0 秒 | 39.1 秒 | 65.8 秒 | 15/138 |
已解决的案例会提前退出。在噪声为 0 时,Feynman 测试套件中有一半在一秒内完成;在噪声下,精确退出路径无法触发,因此这些拟合会运行到上限。
许可证
Keplearn 在 MIT 许可证下发布。
由 Chandler Freeman chandler@mnty.sh(https://github.com/owls-on-wires)创建。
来源:Hacker News · github.com