# What is behind experimental function: FindFormula?

In version 10.2 there is a new experimental function: FindFormula[].

I suspect that a genetic programming algorithm (symbolic regression) is behind this new feature, but I can't find any references.

Question

• What is behind this new function?
• It was inevitable that someone would come along and ask this… Jul 17, 2015 at 17:04
• FWIW I used this until it became paid Jul 17, 2015 at 17:07
• Quite unlikely; I haven't ever seen them add functions to Alpha at the same time as in a new version of Mathematica. Jul 17, 2015 at 17:28
• I think it builds Ill-formed questions from a cursory scan, posts them here, scrapes any answers, and returns the result.... :-)
– ciao
Jul 17, 2015 at 19:12
• @vonjd Hope you'll get it! There shouldn't be that difficult to be generous Jul 18, 2015 at 6:43

The Experimental function FindFormula[] at the moment is using a combination of different methods: it combines non linear regression with Markov chain Monte Carlo methods (e.g. Metropolis–Hastings algorithm). In the future (possibly in V$10.3$) there will be an option allowing the user to choose which method to use.

• Welcome to Mathematica.SE! Jul 22, 2015 at 18:25
• Thank you. How do you know that? Are you in the development team? Jul 22, 2015 at 18:36
• Just found this post. Interesting, Monte Carlo seems to be involved. I have a set of data (not very large, 121 data points) which delivers distinct results every time FindFormula is invoked. I first thought of a bug, but now I see it´s a feature ;-) Apr 27, 2017 at 16:29

I doubt that this is very robust. Consider a simple change in the DE example in the Documentation:

sol = y /. NDSolve[{y'[x] == y[x] Cos[x], y == 2}, y, {x, -5, 300}][];
times = N[Range[-5, 600]/9];
data = Transpose[{times, sol[times] + RandomReal[0.05, Length[times]]}];
lp = ListPlot[data, PlotRange -> All]


Now

FindFormula[data, x, 1, TargetFunctions -> {Exp, Sin, Cos}]


thinks the best solution is 2.27414 Sin[x] + 2.5479. Whereas a much better solution, obviously compatible with the selected TargetFunctions, is 2 Exp[Sin[x]].

• On the other hand, is FindFormula[] even smart enough to consider composing TargetFunctions? Jul 27, 2015 at 13:47
• You don't need to change the DE to get this. The behaviour is the same with the original. Every time I run it I get a different result, and that result is sometimes $e^{\sin{x}}$. The same with the modified one: put it in a Table[..., {20}] and very likely at least one of the results will be $2 e^{\sin x}$. (But requesting 20 functions within the FindFormula doesn't work nearly as well.) Jul 28, 2015 at 7:12

The following reveals definitions

<< GeneralUtilities
PrintDefinitions@FindFormula


As usual one can click the symbols to find definitions of functions "further down". It should also be noted that FindFormula is listed in the Machine Learning guide, which corresponds to symbol names like SymbolicMachineLearningPackageScopeImputArgumentsTestFindFormula shown further down by PrintDefinitions`.