Computing Library › Scientific Ml
Scientific Ml

Genetic Programming for Symbolic Regression

Genetic programming evolves a population of expression trees through selection, crossover, and mutation to discover fitting formulas.

Expressions as trees

Genetic programming represents each candidate formula as a tree: internal nodes are operators such as plus or times, and leaves are variables or constants. Evaluating the tree on the inputs produces a prediction. This representation is flexible enough to encode any algebraic expression and easy to modify by rearranging subtrees.

The evolutionary loop

A population of random trees is scored by a fitness function that rewards accuracy and penalizes size. The fittest trees are selected to reproduce. Crossover swaps subtrees between two parents, mixing partial solutions. Mutation randomly alters a node or subtree, injecting new structure. Repeating selection, crossover, and mutation over many generations drives the population toward better formulas.

Controlling bloat

Left unchecked, trees grow ever larger without improving fit, a phenomenon called bloat. Countermeasures include penalizing size in the fitness score, capping tree depth, and periodically simplifying expressions algebraically. Managing bloat is essential to keep the discovered laws readable.

Practical ingredients

Strengths and cautions

Genetic programming makes no assumption about the form of the law and can discover structure that library-based methods miss. It is stochastic, so results vary between runs, and it can be slow because each generation evaluates many candidates. Running several seeds and keeping only expressions that recur is a sound way to separate genuine structure from lucky fits.