
如何 10 分钟用 PySR 从数据里挖出可解释的数学公式【免费下载链接】PySRSymbolic Learning in Python and Julia项目地址: https://gitcode.com/GitHub_Trending/py/PySRPySR 是一个用 Python 写、用 Julia 跑的符号回归Symbolic Regression工具你给它一张数值表它自己搜索出一段能解释这张表的数学公式。如果你正被模型预测很准但没人看得懂困扰或者手上一堆实验数据想反推背后的规律PySR 把从数据还原公式这件事压缩成了几行 scikit-learn 风格的代码。为什么需要符号回归神经网络越堆越大黑盒问题也越严重——它告诉你答案但说不清理由。符号回归换了个思路不猜结构而是让算法在一棵棵表达式树里做进化搜索直接产出像 $2.5382\cos(x_3) x_0^2 - 0.5$ 这样人能读写的公式。它的好处很具体公式本身即解释可以直接写进论文和报告表达式计算成本远低于神经网络外推行为也更好预测PySR 的搜索引擎用 Julia 实现与 SymbolicRegression.jl 对接多线程并行Python 侧只负责调度和导出。需要注意的是符号回归在低维数据几十列以内、几千行上效果最好。高维场景一般先用符号蒸馏把神经网络转成公式再让 PySR 接手README.md 中有说明。上图是一次典型搜索的产出对比横轴是真实值纵轴是模型用发现出的公式做出的预测点贴着对角线说明公式基本还原了数据规律。安装与 5 分钟上手安装只需一行Julia 依赖会在第一次 import 时自动拉取首次会稍慢属正常现象pip install pysr # 或者 conda install -c conda-forge pysr最小可运行路径直接粘进 IPython作者推荐 IPython 而非 Jupyter进度条和按q提前停止的体验更好import numpy as np from pysr import PySRRegressor # 造一个带 5 个特征的样本集目标是 2.5382*cos(x3) x0^2 - 0.5 X 2 * np.random.randn(100, 5) y 2.5382 * np.cos(X[:, 3]) X[:, 0] ** 2 - 0.5 # 只允许这些算子搜索空间越小越容易收敛 model PySRRegressor( niterations40, # 迭代轮数想要更好结果就调大 binary_operators[, *], unary_operators[cos, exp, sin], elementwise_lossloss(prediction, target) (prediction - target)^2, ) model.fit(X, y) # 内部启动 Julia 进程做多线程搜索 print(model) # 打印排行榜箭头标记被选中的公式model.fit(X, y)返回后model.equations_是一个 pandas DataFrame存着所有候选公式及其 loss、complexitymodel.sympy()拿到 SymPy 表达式model.predict(X)用自动选中的公式做预测model.predict(X, 3)则指定用排行榜第 3 条。每次运行还会落盘hall_of_fame...csv公式列表和同名.pkl搜索状态之后可用PySRRegressor.from_file(xxx.pkl)直接恢复。更完整的演示脚本可以对照 example.py交互教程在 examples/pysr_demo.ipynb。关键参数改哪个、为什么改不用背全部参数下面这几个是真正影响结果的参数改什么建议niterations搜索迭代轮数每轮含数十万次变异和求值最终跑可以设得很大配合停止条件即可populations并行种群数官方建议3 * 物理核数docs/src/tuning.mdbinary_operators/unary_operators搜索的算子词汇表只留你觉得它会用到的算子越少越收敛冗余算子如neg和二元-不要同时给maxsize公式的最大复杂度比期望的最终大小略大一点比如想要 size 30 就设 35给搜索留探索空间early_stop_condition提前停止条件写成 Julia 谓词如stop_if(loss, complexity) loss 1e-6 complexity 10timeout_in_seconds兜底超时长时间任务务必设一个防止跑到天荒地老warm_start从上次搜索状态续跑连续实验很方便但改maxsize、换算子等参数后必须model.reset()否则报错denoise/select_k_features训练前用高斯过程去噪 / 先筛选 k 个最重要特征有噪声或特征特别多时值得开作者本人日常并不常用另外两个进阶旋钮constraints/nested_constraints可以禁止某些嵌套比如exp(exp(x))官方调优笔记里反复强调能卡多严卡多严对探索效率帮助很大turboTrue开启实验性循环向量化约能提速 20%。完整参数列表见 pysr/sr.py 中的PySRRegressordocstring。典型场景一带噪声的回归数据带噪时直接把噪声喂给搜索器会白费搜索预算。denoiseTrue会先用高斯过程把目标去噪再在去噪后的目标上搜索官方示例docs/src/examples/getting-started.md就用了这个组合X np.random.randn(100, 5) y np.exp(X[:, 0]) X[:, 1] X[:, 2] 0.1 * np.random.randn(100) # 目标加噪 model PySRRegressor( binary_operators[, -, *, /], unary_operators[exp], denoiseTrue, # 先用高斯过程平滑 y再开始符号搜索 ) model.fit(X, y)输入是 100×5 的噪声表过程是去噪→进化搜索产出是一条能还原exp(x0)x1x2结构、常数项干净的公式。如果你的数据有每行的信噪比信息还可以给fit传weights并把elementwise_loss写成带weight参数的三参版本。典型场景二不止回归——从规则表反推游戏定律PySR 的输入不限于浮点数。仓库里的 examples/game_of_life.py 把康威生命格的转移表细胞当前状态 邻居数 → 下一状态当作数据集只用and/or/not/eq几个布尔算子搜索结果把 B3/S23 规则完整还原了出来。同样的思路在 examples/magnetic_field.py 里用TemplateExpressionSpec 自定义Force类型从纯力测量数据里解出了磁场分量B_x(t), B_y(t), B_z(t)的解析形式——输入是 1000 组(t, v, T, F)产出是三个磁场分量的函数表达式。这说明从数据反推规律这件事数值之外也能做。符号回归的天花板不低社区用它从模拟数据里挖出星系质量关系、从贸易数据里复现了上式的引力模型见 docs/papers.yml 收录的研究案例。常见问题与踩坑提示import 时崩溃报GLIBCXX_...not found某个依赖加载了错误的libstdc。把 Julia 的库目录加进LD_LIBRARY_PATHREADME 的 Troubleshooting 一节有示例命令。Jupyter 里没有进度条、不能按q停止这是已知取舍。日常调参用 IPythonJupyter 里中断只会返回当前已找到的公式。改了参数后fit报 warm start 冲突warm_start状态下改maxsize、换算子等都会让旧状态失效先调model.reset()。数据超过 1000 行官方建议要么随机下采样到约 1000 行低维、噪声少时要么开batchingTrue高维或噪声大、每条数据都要用到时。公式越搜越复杂、卡住不动试试warmup_maxsize_by强制从简单公式起步逐步放复杂度或对不喜欢的算子在complexity_of_operators里加价。数值不放心公式嵌套深、幅度大时把precision64打开做高精度求值。进阶与生态结果导出链路很全SymPypysr/export_sympy.py、LaTeXpysr/export_latex.py、可微的 JAX / PyTorch 函数model.jax()、model.pytorch()对应 pysr/export_jax.py、pysr/export_torch.py拿去做后续微分优化都没问题。集群扩展cluster_managerslurm一键把搜索铺到整个 SLURM 分配上多节点配置参考 docs/src/slurm.md容器化可用 Dockerfile 或 Apptainer.def。自定义值类型TypeSpec让你定义自己的数据形态向量、布尔格、矩阵……配合自定义损失实现上文的规则发现类玩法用法见 docs/src/examples/expression-specifications.md。给编码代理用的使用指南在 skills/pysr/SKILL.md。小结与下一步一句话回顾PySR 用 Python 的接口 Julia 的引擎把从数据反推公式变成了一次fit调用——先给最小配置跑通再用niterations、算子表和maxsize三个旋钮收紧搜索。下一步建议把 example.py 换成你自己的数据跑一遍然后照 docs/src/tuning.md 的清单调参跑出一版满意的结果后顺手把案例提 PR 到社区的研究展示页。【免费下载链接】PySRSymbolic Learning in Python and Julia项目地址: https://gitcode.com/GitHub_Trending/py/PySR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考