Symbolic Learning in Python and Julia PySR, an open-source symbolic regression tool developed alongside the Julia library SymbolicRegression.jl, is installable via pip or conda and now offers a coding-agent skill installed with the command "npx skills add astroautomata/PySR." PySR's algorithms are documented in arXiv paper 2305.01582, and the tool targets interpretable symbolic expressions for low-dimensional datasets, with symbolic distillation of neural networks (arXiv 2006.11287) extending it to higher-dimensional problems such as N-body equations. The package exposes a scikit-learn-style PySRRegressor interface and ships Docker and Apptainer build files for containerized or cluster use. pip install pysr If you find PySR useful, please cite the paper arXiv:2305.01582 https://arxiv.org/abs/2305.01582 . If you've finished a project with PySR, please submit a PR to showcase your work on the research showcase page https://pysr.ai/papers Contents : PySR is an open-source tool for Symbolic Regression : a machine learning task where the goal is to find an interpretable symbolic expression that optimizes some objective. Over a period of several years, PySR has been engineered from the ground up to be 1 as high-performance as possible, 2 as configurable as possible, and 3 easy to use. PySR is developed alongside the Julia library SymbolicRegression.jl https://github.com/astroautomata/SymbolicRegression.jl , which forms the powerful search engine of PySR. The details of these algorithms are described in the PySR paper https://arxiv.org/abs/2305.01582 . Symbolic regression works best on low-dimensional datasets, but one can also extend these approaches to higher-dimensional spaces by using " Symbolic Distillation " of Neural Networks, as explained in 2006.11287 https://arxiv.org/abs/2006.11287 , where we apply it to N-body problems. Here, one essentially uses symbolic regression to convert a neural net to an analytic equation. Thus, these tools simultaneously present an explicit and powerful way to interpret deep neural networks. You can install PySR with pip or conda: pip install pysr conda install -c conda-forge pysr Julia dependencies will be installed at first import. Install the PySR skill https://github.com/astroautomata/PySR/blob/master/skills/pysr/SKILL.md to provide your coding agents guidance using PySR as part of a larger agentic loop: npx skills add astroautomata/PySR Add --global to install the skill globally. You can also use the Dockerfile to install PySR in a docker container 1. Clone this repo. 2. Within the repo's directory, build the docker container: docker build -t pysr . 1. You can then start the container with an IPython execution with: docker run -it --rm pysr ipython For more details, see the docker section docker . If you are using PySR on a cluster where you do not have root access, you can use Apptainer https://apptainer.org/ to build a container instead of Docker. The Apptainer.def file is analogous to the Dockerfile , and can be built with: apptainer build --notest pysr.sif Apptainer.def and launched with apptainer run pysr.sif One issue you might run into can result in a hard crash at import with a message like " GLIBCXX ... not found". This is due to another one of the Python dependencies loading an incorrect libstdc++ library. To fix this, you should modify your LD LIBRARY PATH variable to reference the Julia libraries. For example, if the Julia version of libstdc++.so is located in $HOME/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/lib/julia/ which likely differs on your system , you could add: export LD LIBRARY PATH=$HOME/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/lib/julia/:$LD LIBRARY PATH to your .bashrc or .zshrc file. You might wish to try the interactive tutorial here https://colab.research.google.com/github/astroautomata/PySR/blob/master/examples/pysr demo.ipynb , which uses the notebook in examples/pysr demo.ipynb . In practice, I highly recommend using IPython rather than Jupyter, as the printing is much nicer. Below is a quick demo here which you can paste into a Python runtime. First, let's import numpy to generate some test data: python import numpy as np X = 2 np.random.randn 100, 5 y = 2.5382 np.cos X :, 3 + X :, 0 2 - 0.5 We have created a dataset with 100 datapoints, with 5 features each. The relation we wish to model is Now, let's create a PySR model and train it. PySR's main interface is in the style of scikit-learn: python from pysr import PySRRegressor model = PySRRegressor maxsize=20, niterations=40, < Increase me for better results binary operators= "+", " " , unary operators= "cos", "exp", "sin", "inv x = 1/x", ^ Custom operator julia syntax , extra sympy mappings={"inv": lambda x: 1 / x}, ^ Define operator for SymPy as well elementwise loss="loss prediction, target = prediction - target ^2", ^ Custom loss function julia syntax This will set up the model for 40 iterations of the search code, which contains hundreds of thousands of mutations and equation evaluations. Let's train this model on our dataset: model.fit X, y Internally, this launches a Julia process which will do a multithreaded search for equations to fit the dataset. Equations will be printed during training, and once you are satisfied, you may quit early by hitting 'q' and then