PySR
PySR 是一款专为 Python 和 Julia 打造的高性能符号回归开源工具。它的核心任务是从数据中自动挖掘出简洁、可解释的数学公式,而不仅仅是提供一个难以理解的“黑盒”预测模型。
在传统机器学习中,模型往往缺乏透明度,用户难以知晓其背后的逻辑。PySR 正是为了解决这一痛点而生,它通过进化算法搜索最优的符号表达式,让数据分析结果变得直观且易于验证。这使得它特别适合科研人员、数据科学家以及需要探索物理定律或数学关系的开发者使用,尤其是在处理低维数据集或试图从神经网络中提取解析方程(即“符号蒸馏”)时表现卓越。
PySR 的独特之处在于其强大的底层引擎由 Julia 语言编写,确保了极高的运算效率,同时提供了友好的 Python 接口,兼顾了性能与易用性。无论是希望发现新科学规律的研究者,还是追求模型可解释性的工程师,PySR 都能帮助你从复杂数据中提炼出清晰优雅的数学真理。
使用场景
某航天动力学研究团队正试图从海量的卫星轨道遥测数据中,反推描述天体引力相互作用的核心物理公式。
没有 PySR 时
- 研究人员只能依赖神经网络进行黑盒拟合,虽然预测精度尚可,但无法获得具有物理意义的解析表达式,导致模型不可解释。
- 为了猜测正确的公式形式,团队需耗费数周时间手动尝试多项式、三角函数等组合,效率极低且极易陷入局部最优解。
- 面对高维度的 N 体问题数据,传统符号回归算法计算速度缓慢,往往在找到可行解前就已耗尽计算资源。
- 最终得到的复杂模型难以嵌入到现有的仿真系统中,工程师不得不花费大量精力进行二次简化,引入了额外误差。
使用 PySR 后
- PySR 直接搜索并输出了简洁的符号表达式(如牛顿万有引力定律变体),让物理学家能立即理解变量间的因果逻辑。
- 依托其底层 Julia 引擎的高性能搜索策略,原本需要数周的公式发现过程被缩短至几小时,自动探索了更广阔的函数空间。
- 通过“符号蒸馏”技术,PySR 成功将高精度神经网络的内部逻辑转化为显式方程,完美解决了高维数据的可解释性难题。
- 生成的公式可直接导出为 Python 或 C 代码,无缝集成到实时轨道预测系统中,大幅提升了工程落地效率。
PySR 将晦涩的数据拟合转变为可理解的物理发现,真正实现了从“预测结果”到“掌握规律”的跨越。
运行环境要求
- Linux
- Windows
- macOS
未说明
未说明

快速开始
PySR 寻找能够优化特定目标的符号表达式。
https://github.com/MilesCranmer/PySR/assets/7593028/c8511a49-b408-488f-8f18-b1749078268f
PySR:Python 和 Julia 中的高性能符号回归
| 文档 | 论坛 | 论文 | Colab 示例 |
|---|---|---|---|
| pip | conda | 统计信息 |
|---|---|---|
如果您觉得 PySR 很有用,请引用论文 arXiv:2305.01582。 如果您已经使用 PySR 完成了某个项目,请提交 PR,在 研究展示页面 上分享您的成果!
目录:
为什么选择 PySR?
PySR 是一款用于 符号回归 的开源工具:这是一种机器学习任务,其目标是找到一个可解释的符号表达式,以优化某个目标函数。
在数年的时间里,PySR 从零开始设计,旨在做到(1)尽可能高效,(2)尽可能灵活可配置,以及(3)易于使用。PySR 与 Julia 库 SymbolicRegression.jl 联合开发,后者构成了 PySR 强大的搜索引擎。这些算法的详细内容已在 PySR 论文 中阐述。
符号回归最适合低维数据集,但也可以通过“神经网络符号蒸馏”将其扩展到高维空间,如 2006.11287 所述,我们将其应用于 N 体问题。本质上,这种方法利用符号回归将神经网络转换为解析方程。因此,这些工具同时提供了一种明确而强大的方式来解释深度神经网络。
安装
pip
您可以通过 pip 安装 PySR:
pip install pysr
Julia 的依赖项将在首次导入时自动安装。
conda
同样地,使用 conda:
conda install -c conda-forge pysr
Docker
您还可以使用 Dockerfile 在 Docker 容器中安装 PySR。
- 克隆此仓库。
- 在仓库目录下构建 Docker 容器:
docker build -t pysr .
- 然后可以启动容器并运行 IPython:
docker run -it --rm pysr ipython
更多详情请参阅 Docker 部分。
Apptainer
如果您在没有 root 权限的集群上使用 PySR,可以使用 Apptainer 构建容器,而不是 Docker。Apptainer.def 文件类似于 Dockerfile,可以通过以下命令构建:
apptainer build --notest pysr.sif Apptainer.def
然后使用以下命令运行:
apptainer run pysr.sif
故障排除
您可能会遇到的一个问题是,在导入时出现类似“GLIBCXX_... 未找到”的严重错误。这是由于另一个 Python 依赖项加载了错误的 libstdc++ 库所致。要解决这个问题,您需要修改 LD_LIBRARY_PATH 变量,使其指向 Julia 的库文件。例如,如果 Julia 版本的 libstdc++.so 位于 $HOME/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/lib/julia/(这可能因系统而异!),您可以将以下内容添加到 .bashrc 或 .zshrc 文件中:
export LD_LIBRARY_PATH=$HOME/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/lib/julia/:$LD_LIBRARY_PATH
快速入门
您可以尝试这里的交互式教程 这里,它使用了 examples/pysr_demo.ipynb 中的笔记本。
在实际操作中,我强烈建议使用 IPython 而不是 Jupyter,因为它的输出效果更好。下面是一个快速演示,您可以将其粘贴到 Python 运行环境中。
首先,我们导入 numpy 来生成一些测试数据:
import numpy as np
X = 2 * np.random.randn(100, 5)
y = 2.5382 * np.cos(X[:, 3]) + X[:, 0] ** 2 - 0.5
我们创建了一个包含 100 个样本、每个样本有 5 个特征的数据集。我们希望建模的关系是 $2.5382 \cos(x_3) + x_0^2 - 0.5$。
现在,让我们创建一个 PySR 模型并进行训练。PySR 的主要接口风格类似于 scikit-learn:
from pysr import PySRRegressor
model = PySRRegressor(
maxsize=20,
niterations=40, # < 增加此值以获得更好的结果
binary_operators=["+", "*"],
unary_operators=[
"cos",
"exp",
"sin",
"inv(x) = 1/x",
# ^ 自定义运算符(Julia 语法)
],
extra_sympy_mappings={"inv": lambda x: 1 / x},
# ^ 同时为 SymPy 定义运算符
elementwise_loss="loss(prediction, target) = (prediction - target)^2",
# ^ 自定义损失函数(Julia 语法)
)
这将设置模型进行 40 次迭代的搜索,每次迭代包含数十万次突变和方程评估。
让我们用我们的数据集来训练这个模型:
model.fit(X, y)
在内部,这会启动一个 Julia 进程,该进程将以多线程方式搜索适合数据集的方程。
训练过程中会打印出方程,当您满意时,可以通过按 'q' 然后按回车键提前退出。
模型拟合完成后,您可以运行 model.predict(X) 来查看使用自动选择的表达式对给定数据集的预测结果;或者例如,运行 model.predict(X, 3) 来查看第 3 个方程的预测结果。
您还可以运行以下命令来打印学习到的方程:
print(model)
输出如下:
PySRRegressor.equations_ = [
pick score equation loss complexity
0 0.000000 4.4324794 42.354317 1
1 1.255691 (x0 * x0) 3.437307 3
2 0.011629 ((x0 * x0) + -0.28087974) 3.358285 5
3 0.897855 ((x0 * x0) + cos(x3)) 1.368308 6
4 0.857018 ((x0 * x0) + (cos(x3) * 2.4566472)) 0.246483 8
5 >>>> inf (((cos(x3) + -0.19699033) * 2.5382123) + (x0 *... 0.000000 10
]
pick 列中的箭头表示当前由您的 model_selection 策略选定用于预测的方程。(您也可以在 .fit(X, y) 之后更改 model_selection。)
model.equations_ 是一个 pandas DataFrame,包含了所有方程,包括可调用格式 (lambda_format)、SymPy 格式 (sympy_format - 您也可以通过 model.sympy() 获取)、甚至 JAX 和 PyTorch 格式(两者都可微分 - 您可以通过 model.jax() 和 model.pytorch() 获取)。
请注意,PySRRegressor 会保存上次搜索的状态,并在您下次调用 .fit() 时从上次停止的地方继续,前提是您已设置 warm_start=True。如果对搜索参数进行了重大更改(例如更改运算符),则可能会出现问题。您可以运行 model.reset() 来重置状态。
您会注意到 PySR 会保存两个文件:hall_of_fame...csv 和 hall_of_fame...pkl。CSV 文件列出了方程及其损失,而 PKL 文件则是模型的保存状态。您可以从 PKL 文件加载模型,方法如下:
model = PySRRegressor.from_file("hall_of_fame.2022-08-10_100832.281.pkl")
此外,PySR 还提供了其他一些有用的功能,例如去噪(如 denoise=True)和特征选择(如 select_k_features=3)。有关这些功能及其他功能的示例,请参阅 示例页面。有关更多选项的详细信息,请参阅 选项页面。您还可以在 API 页面 上查看完整的 API。此外,调优页面 提供了调整 PySR 的技巧。
详细示例
以下代码尽可能地使用了 PySR 的所有功能。请注意,这只是一个功能演示,您不应直接使用此示例。有关每个参数的具体作用,请参阅 API 页面。
model = PySRRegressor(
populations=8,
# ^ 假设我们有4个核心,这意味着每个核心运行2个种群,因此总有一个种群在持续运行。
population_size=50,
# ^ 稍大的种群规模,以增加多样性。
ncycles_per_iteration=500,
# ^ 种群之间迁移的代数间隔。
niterations=10000000, # 无限运行
early_stop_condition=(
"stop_if(loss, complexity) = loss < 1e-6 && complexity < 10"
# 如果找到一个既好又简单的方程,则提前停止
),
timeout_in_seconds=60 * 60 * 24,
# ^ 或者,在24小时后停止。
maxsize=50,
# ^ 允许更高的复杂度。
maxdepth=10,
# ^ 但避免过深的嵌套。
binary_operators=["*", "+", "-", "/"],
unary_operators=["square", "cube", "exp", "cos2(x)=cos(x)^2"],
constraints={
"/": (-1, 9),
"square": 9,
"cube": 9,
"exp": 9,
},
# ^ 限制每个参数内的复杂度。
# "inv": (-1, 9) 表示分子没有约束,
# 但分母的最大复杂度为9。
# "exp": 9 则表示 `exp` 只能接受复杂度为9的表达式作为输入。
nested_constraints={
"square": {"square": 1, "cube": 1, "exp": 0},
"cube": {"square": 1, "cube": 1, "exp": 0},
"exp": {"square": 1, "cube": 1, "exp": 0},
},
# ^ 对运算符进行嵌套约束。例如,
# "square(exp(x))" 是不允许的,因为 "square": {"exp": 0}。
complexity_of_operators={"/": 2, "exp": 3},
# ^ 自定义特定运算符的复杂度。
complexity_of_constants=2,
# ^ 惩罚常数比变量更重。
select_k_features=4,
# ^ 只使用最重要的4个特征进行训练。
progress=True,
# ^ 如果输出到文件,可以设置为False。
weight_randomize=0.1,
# ^ 更频繁地随机化树结构。
cluster_manager=None,
# ^ 可以设置为例如 "slurm" 来运行 slurm 集群。只需从主节点启动一个脚本即可。
precision=64,
# ^ 使用更高精度的计算。
warm_start=True,
# ^ 从上次中断的地方继续。
turbo=True,
# ^ 更快的评估(实验性)
extra_sympy_mappings={"cos2": lambda x: sympy.cos(x)**2},
# extra_torch_mappings={sympy.cos: torch.cos},
# ^ 这里不需要,因为 cos 已经定义,但这正是定义自定义 PyTorch 运算符的方式。
# extra_jax_mappings={sympy.cos: "jnp.cos"},
# ^ 对于 JAX,需要传递字符串。
)
Docker
您也可以在 Docker 中测试 PySR,而无需在本地安装它。只需在本仓库的根目录下运行以下命令:
docker build -t pysr .
这将为您的系统架构构建一个名为 pysr 的镜像,其中还包含 IPython。您可以选择特定版本的 Python 和 Julia,方法如下:
docker build -t pysr --build-arg JLVERSION=1.10.0 --build-arg PYVERSION=3.11.6 .
然后,您可以使用以下 Dockerfile 运行容器:
docker run -it --rm -v "$PWD:/data" pysr ipython
这会将当前目录挂载到容器的 /data 目录,并启动 IPython。
如果您在构建适用于您系统架构的镜像时遇到问题,可以在 build 和 run 命令前添加 --platform linux/amd64 来模拟其他架构。
贡献者 ✨
我们热忱欢迎新贡献者!请查看我们的贡献者 指南,获取实用建议 🚀。如果您对新功能有任何想法,请随时在 issues 或 discussions 页面上分享。
![]() Mark Kittisopikul 💻 💡 🚇 📦 📣 👀 🔧 ⚠️ |
![]() T Coxon 🐛 💻 🔌 💡 🚇 🚧 👀 🔧 ⚠️ 📓 |
![]() Dhananjay Ashok 💻 🌍 💡 🚧 ⚠️ |
![]() Johan Blåbäck 🐛 💻 💡 🚧 📣 👀 ⚠️ 📓 |
![]() JuliusMartensen 🐛 💻 📖 🔌 💡 🚇 🚧 📦 📣 👀 🔧 📓 |
![]() ngam 💻 🚇 📦 👀 🔧 ⚠️ |
![]() Christopher Rowley 💻 💡 🚇 📦 👀 |
![]() Kaze Wong 🐛 💻 💡 🚇 🚧 📣 👀 🔬 📓 |
![]() Christopher Rackauckas 🐛 💻 🔌 💡 🚇 📣 👀 🔬 🔧 ⚠️ 📓 |
![]() Patrick Kidger 🐛 💻 📖 🔌 💡 🚧 📣 👀 🔬 🔧 ⚠️ 📓 |
![]() Okon Samuel 🐛 💻 📖 🚧 💡 🚇 👀 ⚠️ 📓 |
![]() William Booth-Clibborn 💻 🌍 📖 📓 🚧 👀 🔧 ⚠️ |
![]() Pablo Lemos 🐛 💡 📣 👀 🔬 📓 |
![]() Jerry Ling 🐛 💻 📖 🌍 💡 📣 👀 📓 |
![]() Charles Fox 🐛 💻 💡 🚧 📣 👀 🔬 📓 |
![]() Johann Brehmer 💻 📖 💡 📣 👀 🔬 ⚠️ 📓 |
![]() Marius Millea 💻 💡 📣 👀 📓 |
![]() Coba 🐛 💻 💡 👀 📓 |
![]() foxtran 💻 💡 🚧 🔧 📓 |
![]() Shah Mahdi Hasan 🐛 💻 👀 📓 |
![]() Pietro Monticone 🐛 📖 💡 |
![]() Mateusz Kubica 📖 💡 |
![]() Jay Wadekar 🐛 💡 📣 🔬 |
![]() Anthony Blaom, PhD 🚇 💡 👀 |
![]() Jgmedina95 🐛 💡 👀 |
![]() Michael Abbott 💻 💡 👀 🔧 |
![]() Oscar Smith 💻 💡 |
![]() Eric Hanson 💡 📣 📓 |
![]() Henrique Becker 💻 💡 👀 |
![]() qwertyjl 🐛 📖 💡 📓 |
![]() Rik Huijzer 💡 🚇 |
![]() Hongyu Wang 💡 📣 🔬 |
![]() Zehao Jin 🔬 📣 |
![]() Tanner Mengel 🔬 📣 |
![]() Arthur Grundner 🔬 📣 |
![]() sjwetzel 🔬 📣 📓 |
![]() Saurav Maheshkar 🔧 |
版本历史
v1.5.102026/03/30v2.0.0a12025/10/08v1.5.92025/07/15v1.5.82025/05/20v1.5.72025/05/19v1.5.62025/05/04v1.5.52025/04/02v1.5.42025/04/01v1.5.32025/03/28v1.5.22025/03/05v1.5.12025/03/01v1.5.02025/02/25v1.4.02025/02/13v1.3.12024/12/27v1.3.02024/12/15v1.2.02024/12/14v1.1.02024/12/09v1.0.22024/12/07v1.0.12024/12/06v1.0.02024/12/01常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备





































