← 返回信息流
AI 资讯Hacker News·5 天前

纯Python符号回归仅用8个数据点重新发现开普勒定律

原标题:Pure-Python symbolic regression that rediscovered Kepler's law from 8 data point

速览

一项研究使用纯Python实现的符号回归算法,仅从8个数据点就重新发现了开普勒定律,展示了机器学习在科学发现中的潜力。该方法无需大量数据即可自动推导物理定律,有望加速科学探索。

AI 深度解读

背景

符号回归(Symbolic Regression)是一种从数据中自动发现数学公式的机器学习方法,与传统的黑箱模型(如神经网络)不同,它生成的公式是可解释的,因此特别适合物理、工程、生物等需要理解变量间内在关系的领域。然而,大多数符号回归工具要么依赖 Julia 语言(如 PySR)、要么需要编译和 GPU 加速,门槛较高。GP_ELITE 是一个纯 Python + NumPy 实现的符号回归库,专为小型实验数据集设计,目标是让实验室工程师、学生或技术人员无需成为开发者,就能从 CSV 文件中直接获得一个经过验证的数学定律。

核心内容

GP_ELITE 基于遗传编程(Genetic Programming)实现符号回归,通过进化搜索找到连接输入变量与目标变量的数学表达式。其核心特点包括:

  • 纯 Python / NumPy 实现:无需 Julia、无需编译、无需 GPU,只需 pip install gp-elite 即可使用。
  • 从极少数据点发现物理定律:仅用 8 个行星的距离和轨道周期数据,GP_ELITE 在数秒内重新发现了开普勒第三定律(T = a·√a = a^1.5),相关示例见 examples/kepler_demo.py
  • 易用接口symbolic_regression 函数接受特征矩阵 X、目标向量 y 和特征名称列表,返回包含表达式、验证 R²、节点数等信息的对象。
  • Levenberg–Marquardt 常数优化(默认):常数可达机器精度,例如库仑定律 q1·q2/(4πεr²) 的恢复结果中 1−R² ≈ 8e-32,在常数密集型问题上比 Adam 快 6–14 倍。
  • 多启动可靠性(restarts=N:独立运行共享同一个确定性留出集,合并候选档案后进行全局选择,减少随机性影响。
  • 帕累托前沿输出(result.pareto:返回复杂度与准确度的完整阶梯,每个节点都有对应的 predict 方法。
  • 外推/预测模式(extrapolate_featureextrapolate_direction:通过域外散点探测、线性安全底限和前沿选择,实现受控的外推。
  • 可复现性:同一进程内相同种子给出相同结果;跨进程运行时设置 PYTHONHASHSEED=0 可确保全局复现。
  • 鲁棒回归(robust=True:内置 Huber 损失与 IRLS(迭代重加权最小二乘)过程,可在 10–20% 异常值下恢复真实公式,而普通 MSE 会严重偏离。
  • 内置过拟合防护:使用留出验证集和基于 R² 容差的简洁冠军选择策略。
  • 线性缩放(Keijzer 2003):遗传编程搜索形状,而缩放和偏移系数通过闭式求解,提高效率。
  • 岛屿模型并行:支持多核并行(实测 4 核加速约 3 倍)。

实际应用示例:从 168 个真实电池充放电循环数据中,GP_ELITE 发现了一个状态健康(SOH)公式:

capacity_SOH ≈ 0.913 − 0.352 · tanh( cycle^((temperature/cycle)^0.485) )

验证 R² = 0.996(在未见过的循环上),节点数仅 12,物理上合理。

基准测试

  • 在冻结的费曼基准(15 个物理方程,PYTHONHASHSEED=0restarts=4)上:10/15 精确恢复(67%,1−R² < 1e-9),14/15 误差在 1e-3 以内(93%)。
  • 与 gplearn 在相同数据/分割上对比(gplearn 使用更慷慨的预算):67% vs 40% 精确恢复,GP_ELITE 在 9 个方程上领先,5 个持平,1 个落后。
  • 真实数据预测(NASA 电池 SOH 外推):中位数 R² 为 +0.52,线性回归为 +0.34,且无发散模型。

局限性

  • 不适用于混沌序列(如 Collatz 飞行时间,含有随机成分)。
  • 变量超过 15–20 个时搜索空间爆炸。
  • 大规模数据集且原始精度优先于可解释性时,集成模型更优。

安装与依赖

pip install gp-elite
# 或从源码安装
git clone https://github.com/ariel95500-create/gp-elite
cd gp-elite && pip install -e .

依赖:numpypandasscikit-learn

使用示例

import numpy as np
from gp_elite import symbolic_regression

X = np.random.uniform(1, 5, (200, 2))
y = 2.0 + 3.0 * np.sqrt(X[:, 0]) - 0.5 * X[:, 1]

result = symbolic_regression(
    X, y,
    feature_names=["a", "b"],
    operators="physical",  # 'physical' | 'trig' | 'full' | 'poly'
    generations=60,
    speed="fast",  # 'ultrafast' | 'fast' | 'normal'
)
print(result.expression)  # e.g. 2.0 + 3.0·sqrt(a) - 0.5·b
print(result.r2_validation)  # 留出集上的质量
print(result.size)  # 节点数(可读性)

交互模式:选择模式 6(通用 CSV),指向文件并保持默认,GP_ELITE 自动检测列、留出验证集并进化,最后打印发现的定律和泛化报告。

许可证:MIT,可免费商用,需保留版权声明。

关键要点

  • 零门槛符号回归:纯 Python 实现,无需编译或 GPU,适合非开发者使用。
  • 从极少量数据恢复物理定律:仅用 8 个数据点即重新发现开普勒第三定律,验证了算法在小样本上的能力。
  • 内置常数优化:Levenberg–Marquardt 方法使常数达到机器精度,并在常数密集型问题上显著加速。
  • 鲁棒回归模式:通过 Huber 损失和 IRLS 在 10–20% 异常值下仍能恢复真实公式,而普通 MSE 会失败。
  • 帕累托前沿与复杂度控制:自动提供复杂度与准确度的权衡曲线,帮助用户选择最简洁且足够准确的公式。
  • 外推/预测模式:通过域外探测和线性安全底限,实现
查看原文 →github.com