纯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_feature和extrapolate_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=0,restarts=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 .
依赖:numpy、pandas、scikit-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
