SymbolicRegression.jl
Latest release | Documentation | Build status | Coverage |
---|---|---|---|
Distributed High-Performance symbolic regression in Julia.
Check out PySR for a Python frontend.
<img src="https://astroautomata.com/data/srdemoimage1.png" alt="demo1" width="700"/> <img src="https://astroautomata.com/data/srdemoimage2.png" alt="demo2" width="700"/>
Quickstart
Install in Julia with:
using Pkg
Pkg.add("SymbolicRegression")
The heart of this package is the EquationSearch
function, which takes a 2D array (shape [features, rows]) and attempts to model a 1D array (shape [rows]) using analytic functional forms.
Run distributed on four processes with:
using SymbolicRegression
X = randn(Float32, 5, 100)
y = 2 * cos.(X[4, :]) + X[1, :] .^ 2 .- 2
options = SymbolicRegression.Options(
binary_operators=(+, *, /, -),
unary_operators=(cos, exp),
npopulations=20
)
hall_of_fame = EquationSearch(X, y, niterations=40, options=options, numprocs=4)
We can view the equations in the dominating Pareto frontier with:
dominating = calculate_pareto_frontier(X, y, hall_of_fame, options)
We can convert the best equation to SymbolicUtils.jl with the following function:
eqn = node_to_symbolic(dominating[end].tree, options)
println(simplify(eqn*5 + 3))
We can also print out the full pareto frontier like so:
println("Complexity\tMSE\tEquation")
for member in dominating
complexity = compute_complexity(member.tree, options)
loss = member.loss
string = string_tree(member.tree, options)
println("$(complexity)\t$(loss)\t$(string)")
end
Code structure
The dependency structure is as follows:
stateDiagram-v2
Core --> CheckConstraints
EquationUtils --> CheckConstraints
Core --> ConstantOptimization
Utils --> ConstantOptimization
EquationUtils --> ConstantOptimization
LossFunctions --> ConstantOptimization
PopMember --> ConstantOptimization
ProgramConstants --> Core
Dataset --> Core
OptionsStruct --> Core
Equation --> Core
Options --> Core
Operators --> Core
ProgramConstants --> Dataset
ProgramConstants --> Equation
OptionsStruct --> Equation
Core --> EquationUtils
Core --> EvaluateEquation
Utils --> EvaluateEquation
EquationUtils --> EvaluateEquation
Core --> EvaluateEquationDerivative
Utils --> EvaluateEquationDerivative
EquationUtils --> EvaluateEquationDerivative
EvaluateEquation --> EvaluateEquationDerivative
Core --> HallOfFame
EquationUtils --> HallOfFame
PopMember --> HallOfFame
LossFunctions --> HallOfFame
Core --> InterfaceSymbolicUtils
Utils --> InterfaceSymbolicUtils
Core --> LossFunctions
EquationUtils --> LossFunctions
EvaluateEquation --> LossFunctions
Core --> Mutate
EquationUtils --> Mutate
LossFunctions --> Mutate
CheckConstraints --> Mutate
PopMember --> Mutate
MutationFunctions --> Mutate
SimplifyEquation --> Mutate
Recorder --> Mutate
Core --> MutationFunctions
EquationUtils --> MutationFunctions
Operators --> Options
Equation --> Options
OptionsStruct --> Options
Core --> PopMember
Utils --> PopMember
LossFunctions --> PopMember
Core --> Population
EquationUtils --> Population
LossFunctions --> Population
MutationFunctions --> Population
PopMember --> Population
Core --> Recorder
Core --> RegularizedEvolution
PopMember --> RegularizedEvolution
Population --> RegularizedEvolution
Mutate --> RegularizedEvolution
Recorder --> RegularizedEvolution
Core --> SimplifyEquation
CheckConstraints --> SimplifyEquation
Utils --> SimplifyEquation
Core --> SingleIteration
EquationUtils --> SingleIteration
Utils --> SingleIteration
SimplifyEquation --> SingleIteration
PopMember --> SingleIteration
Population --> SingleIteration
HallOfFame --> SingleIteration
RegularizedEvolution --> SingleIteration
ConstantOptimization --> SingleIteration
Recorder --> SingleIteration
Core --> SymbolicRegression
Utils --> SymbolicRegression
EquationUtils --> SymbolicRegression
EvaluateEquation --> SymbolicRegression
EvaluateEquationDerivative --> SymbolicRegression
CheckConstraints --> SymbolicRegression
MutationFunctions --> SymbolicRegression
LossFunctions --> SymbolicRegression
PopMember --> SymbolicRegression
Population --> SymbolicRegression
HallOfFame --> SymbolicRegression
SingleIteration --> SymbolicRegression
InterfaceSymbolicUtils --> SymbolicRegression
SimplifyEquation --> SymbolicRegression
ProgressBars --> SymbolicRegression
Recorder --> SymbolicRegression
Core --> Utils
Bash command to generate dependency structure from src
directory (requires vim-stream
):
echo 'stateDiagram-v2'
IFS=$'\n'
for f in *.jl; do
for line in $(cat $f | grep -e 'import \.\.' -e 'import \.'); do
echo $(echo $line | vims -s 'dwf:d$' -t '%s/^\.*//g' '%s/Module//g') $(basename "$f" .jl);
done;
done | vims -l 'f a-->