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

Hacker News Top 工具

摘要

GP_ELITE是一个基于遗传编程的符号回归纯Python库,能够从小型实验数据集中发现可解释的数学公式。0.2.0版本引入了莱文贝格-马夸尔特常数拟合、多重重启可靠性、帕累托前沿输出以及外推模式。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/08 05:17

ariel95500-create/gp-elite

来源: https://github.com/ariel95500-create/gp-elite

GP_ELITE

遗传编程符号回归 — 从实验数据中发现可解释的规律。

🇫🇷 法语版

GP_ELITE 致力于寻找连接变量与目标的数学公式,而非黑盒模型。它专为小规模实验数据集(≤10 个变量,100–5000 个数据点)设计,适用于你希望理解变量间关系的场景:退化规律、传感器标定、工程关联、剂量-响应曲线、物理定律。

Python / NumPy — 无需 Julia、无需编译、无需 GPU。pip install 即可使用。

GP_ELITE 从 8 个数据点中重新发现了开普勒第三定律 (R² = 1.000000)

仅凭 8 颗行星的距离和轨道周期,GP_ELITE 在数秒内重新发现了开普勒第三定律 (T = a·√a = a^1.5) — 参见 examples/kepler_demo.py

from gp_elite import symbolic_regression

result = symbolic_regression(X, y, feature_names=["cycle", "temperature", "current"])
print(result.expression)        # capacity_SOH = 0.913 - 0.352·tanh(...)
print(result.r2_validation)     # 0.996  (在训练中从未见过的数据上)

0.2.0 版本新特性

  • Levenberg–Marquardt 常数拟合(默认):常数达到机器精度 — 库仑定律 q1·q2/(4πεr²)精确恢复 (1−R² ≈ 8e-32)。在常数密集型问题上快 6–14 倍。
  • 多重重启可靠性 (restarts=N):独立运行共享一个确定性留出集,合并候选档案,进行全局选择。
  • Pareto 前沿输出 (result.pareto):完整的复杂度 ↔ 准确度阶梯,每个条目都有自己的 .predict 方法。
  • 预测 / 外推模式 (extrapolate_feature=, extrapolate_direction=):域外发散探测、线性安全下限、基于前沿的选择。也可通过交互菜单的模式 7 使用。
  • 可复现性:进程内相同种子产生相同结果;跨调用运行时使用 PYTHONHASHSEED=0

为什么选择 GP_ELITE?

GP_ELITE神经网络PySR(当前最优)
输出可读公式黑盒可读公式
安装pip install(纯 Python)繁琐需要 Julia
过拟合防护内置(留出验证)自行实现自行实现
变量选择重要性报告部分

GP_ELITE 的定位:零入门门槛。实验室工程师、学生或技术人员只需指向一个 CSV 文件,即可获得经过验证的规律——无需成为开发者。


安装

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

依赖:numpypandasscikit-learn


使用方法

一行命令,使用你自己的数据(控制台 UI)

gp-elite

选择模式 6(通用 CSV),指向你的文件,保持默认设置。GP_ELITE 会自动检测列,留出验证集,进行演化,并输出发现的规律及其泛化报告。

编程调用(笔记本、管道)

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)        # 例如 2.0 + 3.0·sqrt(a) - 0.5·b
print(result.r2_validation)     # 留出集上的质量
print(result.size)              # 节点数(可读性)

🛡️ 稳健回归(抗异常值自定义损失)

真实世界的数据是脏的。少量异常值会使普通最小二乘拟合偏离真实关系。GP_ELITE 内置了一个一键切换的稳健模式,即使数据中有相当一部分被污染,也能拟合出真实规律。

from gp_elite import symbolic_regression

# X, y : 你的(可能脏的)数据
result = symbolic_regression(X, y, feature_names=["x"], robust=True)
print(result.expression)

底层原理:robust=True 将目标函数切换为 Huber 损失,并通过 IRLS(迭代重加权最小二乘) 过程重新缩放最终系数,因此拟合由数据主体而非少数极端点主导。最终仍然是一个紧凑、可读的公式。

实测表现(恢复 y = 2x + 1 — 与真实规律在干净点上的 RMSE,越小越好):

异常值比例MSE (默认)robust=True
0%0.0630.063
10%1.3981.374
20%1.9250.543

在干净数据上,普通 MSE 略胜一筹——稳健性并非没有代价。在 10–20% 异常值的情况下,稳健模式能恢复真实规律,而普通 MSE 则偏离。当你怀疑数据中有异常值时,请使用 robust=True

参见 examples/robust_regression.py 获取完整的可复现基准测试。


完整示例:电池退化(NASA 数据)

python examples/battery_soh.py

从 168 个实际充电周期中,GP_ELITE 发现了一个健康状态 (SOH) 规律:

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

R² 验证 = 0.996   (在从未见过的周期上)   12 个节点

一个随循环次数饱和退化、受温度调制的规律——物理上合理,且在未见数据上得到验证


GP_ELITE 擅长(和不擅长)什么?

擅长:具有乘法或指数结构的物理/工程规律、中等规模带噪实验数据、可解释性至关重要的场景。

在冻结的 Feynman 基准(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 vs 线性回归的 +0.34,且没有发散模型。复现:PYTHONHASHSEED=0 python benchmarks/feynman_bench.py 0 15benchmarks/duel.py

不擅长:混沌序列(如 Collatz 飞行时间 —— 内含随机成分)、超过 15–20 个变量(搜索空间爆炸)、原始精度比可解释性更重要的大数据集(此时集成模型占优)。


技术特性

  • Levenberg–Marquardt 常数优化 (v0.2):闭式质量的常数,确定性,可切换 LM/Adam
  • 多重重启 + 合并候选档案 (v0.2):将种子方差转化为可靠性
  • Pareto 前沿 API (v0.2):非支配复杂度/准确度阶梯
  • 带防护的外推 / 预测模式 (v0.2):域外探测、线性下限、前沿选择
  • 组合基元模板播种 (v0.2):嵌套结构的勾股、倒数求和、高斯模板
  • 非对称岛屿模型(探索者 / 清洁者 / 信息素型)伴定期迁移
  • 线性缩放 (Keijzer 2003):引擎搜索形状;尺度和偏移系数以闭式解出
  • ε-lexicase 选择 (La Cava 2016) 以保持行为多样性
  • 岛屿并行(多核)— 4 核实测加速约 ×3
  • 留出验证 + 简洁冠军选择 (R² 容差):内置过拟合防护
  • 无偏移归一化,保留乘法结构 (x·y 保持干净乘积)
  • 跨运行可迁移信息素记忆(语法导出/导入)

测试

pip install pytest
pytest -q

许可协议

MIT — 参见 LICENSE。可自由使用,包括商业用途,需保留版权声明。

引用 GP_ELITE

如果 GP_ELITE 在学术工作中有所助益,请参见 CITATION.cff

相似文章

极简遗传编程

arXiv cs.AI

本文介绍了极简遗传编程(Minimalist Genetic Programming, MGP),一种新颖的算法,它用受语言学中最简方案启发的句法推导过程取代了进化,并使用 MERGE 算子来构建符号表达式。MGP 在符号回归任务中能够一致地找到精确的真实模型,而标准 GP 由于膨胀问题难以做到这一点。

GPT-5 与数学发现的未来

OpenAI Blog

GPT-5 帮助数学家 Ernest Ryu 解决了一个困扰优化理论40年的开放问题,涉及 Nesterov 加速梯度法的稳定性性质。这一突破展示了大型语言模型通过从数学文献中提取相关技术和思想来辅助重大数学发现的能力。

语言模型通过控制搜索引导符号方程发现

arXiv cs.AI

本文介绍了LLM-PySR,一种通过控制搜索参数让语言模型引导符号方程发现的方法,同时使用数值符号回归进行拟合。该方法在基准任务上实现了准确性与复杂性的良好平衡。

通过大型模型的演化

OpenAI Blog

本论文证明了在代码上训练的大型语言模型可以显著增强遗传编程的变异算子,使得能够在 Sodarace 领域中生成数十万个功能性 Python 程序用于机器人设计,且无需预训练数据。该方法称为演化通过大型模型(ELM),将 LLM 与 MAP-Elites 相结合,为上下文特定的制品生成引导新的条件模型。