Keplearn 发布开源符号回归工具,从表格数据快速提取方程
Keplearn: Extract Equations from Data in Seconds
Keplearn 发布 Rust 编写的确定性符号回归工具,可从 TSV 或 CSV 数据中恢复闭式方程并输出 JSON 结果。工具采用最佳优先递归约简,支持 --timeout 等参数,并以单文件程序提供 macOS、Windows 和 Linux 版本,采用 MIT 许可,项目地址为 https://github.com/owls-on-wires/keplearn。
Keplearn 在 SRBench Feynman 无噪声集达到 64.7% 符号解出率,并含安装、调用与基准数据,便于评估符号回归能力。
数秒内完成符号回归。
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 的方法;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 秒上限下,每次拟合使用一个核心时的拟合时间:
| 套件 | 中位数 | 平均值 | 最大值 | 拟合用时少于 1 s |
|---|---|---|---|---|
| Feynman,噪声 0 | 1.3 s | 13.3 s | 60.7 s | 55/116 |
| Feynman,噪声 0.001-0.1 | 11-14 s | 15-23 s | 60.7 s | 0/348 |
| Strogatz,所有噪声级别 | 1.3 s | 1.5 s | 3.6 s | 8/56 |
| 黑盒 | 60.0 s | 39.1 s | 65.8 s | 15/138 |
已求解的用例会提前退出。在噪声为 0 时,Feynman 测试组中有一半的拟合耗时不到 一秒;存在噪声时,精确退出路径无法触发,因此这些拟合会运行至 上限。
许可证
Keplearn 采用 MIT 许可证发布。
由 Chandler Freeman 创建 chandler@mnty.sh(https://github.com/owls-on-wires)。
来源:Hacker News · github.com