%22%22%22Symbolic%20Regression%20with%20Derive%3A%20Discovering%20Mathematical%20Formulas%20from%20Data%22%22%22%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.19.4%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20warnings%0A%20%20%20%20%23%20Suppress%20PySR%20warnings%20about%20constraints%20(shows%20local%20paths)%0A%20%20%20%20warnings.filterwarnings('ignore'%2C%20module%3D'pysr')%0A%20%20%20%20from%20derive%20import%20(%0A%20%20%20%20%20%20%20%20Symbol%2C%20symbols%2C%20Simplify%2C%20Expand%2C%20Collect%2C%0A%20%20%20%20%20%20%20%20Sin%2C%20Cos%2C%20Exp%2C%20Log%2C%20Sqrt%2C%20Pi%2C%0A%20%20%20%20%20%20%20%20D%2C%20Integrate%2C%0A%20%20%20%20)%0A%20%20%20%20from%20derive.regression%20import%20FindFormula%0A%20%20%20%20from%20derive.plotting%20import%20Plot%2C%20ListPlot%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20Collect%2C%0A%20%20%20%20%20%20%20%20D%2C%0A%20%20%20%20%20%20%20%20FindFormula%2C%0A%20%20%20%20%20%20%20%20Integrate%2C%0A%20%20%20%20%20%20%20%20ListPlot%2C%0A%20%20%20%20%20%20%20%20Simplify%2C%0A%20%20%20%20%20%20%20%20Symbol%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Symbolic%20Regression%20with%20Derive%0A%0A%20%20%20%20This%20notebook%20demonstrates%20**symbolic%20regression**%20-%20the%20task%20of%20discovering%0A%20%20%20%20mathematical%20formulas%20that%20fit%20data.%20Derive%20wraps%20the%20powerful%20PySR%20library%0A%20%20%20%20with%20an%20intuitive%20%60FindFormula%60%20interface.%0A%0A%20%20%20%20%23%23%20What%20is%20Symbolic%20Regression%3F%0A%0A%20%20%20%20Unlike%20traditional%20regression%20(linear%2C%20polynomial%2C%20etc.)%20which%20fits%20parameters%0A%20%20%20%20to%20a%20*fixed*%20functional%20form%2C%20symbolic%20regression%20searches%20the%20space%20of%0A%20%20%20%20*all%20possible%20mathematical%20expressions*%20to%20find%20the%20simplest%20formula%20that%0A%20%20%20%20explains%20your%20data.%0A%0A%20%20%20%20This%20is%20especially%20useful%20for%3A%0A%20%20%20%20-%20**Scientific%20discovery**%3A%20Finding%20laws%20from%20experimental%20data%0A%20%20%20%20-%20**Interpretable%20ML**%3A%20Getting%20human-readable%20models%20instead%20of%20black%20boxes%0A%20%20%20%20-%20**Physics**%3A%20Rediscovering%20known%20equations%20from%20simulation%20data%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%201.%20Basic%20Usage%3A%20Linear%20Relationships%0A%0A%20%20%20%20Let's%20start%20with%20a%20simple%20example%20-%20discovering%20a%20linear%20relationship.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(FindFormula%2C%20ListPlot%2C%20Symbol)%3A%0A%20%20%20%20%23%20Generate%20data%20for%20y%20%3D%202x%20%2B%201%0A%20%20%20%20x_lin%20%3D%20Symbol('x')%0A%20%20%20%20data_linear%20%3D%20%5B%5Bi%2C%202*i%20%2B%201%5D%20for%20i%20in%20range(20)%5D%0A%0A%20%20%20%20%23%20Find%20the%20formula%0A%20%20%20%20formula_linear%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20data_linear%2C%20x_lin%2C%0A%20%20%20%20%20%20%20%20niterations%3D10%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D8%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Visualize%0A%20%20%20%20plot_linear%20%3D%20ListPlot(data_linear)%0A%20%20%20%20formula_linear%2C%20plot_linear%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.%20Quadratic%20and%20Polynomial%20Relationships%0A%0A%20%20%20%20FindFormula%20can%20discover%20more%20complex%20polynomial%20relationships.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Collect%2C%20FindFormula%2C%20ListPlot%2C%20Symbol)%3A%0A%20%20%20%20%23%20Generate%20data%20for%20y%20%3D%20x%5E2%20-%203x%20%2B%202%0A%20%20%20%20x_quad%20%3D%20Symbol('x')%0A%20%20%20%20data_quadratic%20%3D%20%5B%5Bi%2C%20i**2%20-%203*i%20%2B%202%5D%20for%20i%20in%20range(-5%2C%2010)%5D%0A%0A%20%20%20%20formula_quadratic_raw%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20data_quadratic%2C%20x_quad%2C%0A%20%20%20%20%20%20%20%20niterations%3D15%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D12%0A%20%20%20%20)%0A%20%20%20%20%23%20Collect%20by%20powers%20of%20x%20for%20cleaner%20display%0A%20%20%20%20formula_quadratic%20%3D%20Collect(formula_quadratic_raw%2C%20x_quad)%0A%0A%20%20%20%20plot_quadratic%20%3D%20ListPlot(data_quadratic)%0A%20%20%20%20formula_quadratic%2C%20plot_quadratic%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%203.%20Trigonometric%20Functions%0A%0A%20%20%20%20By%20specifying%20%60target_functions%60%2C%20we%20can%20guide%20the%20search%20toward%20specific%0A%20%20%20%20function%20classes.%20Here%20we%20look%20for%20sine%2Fcosine%20patterns.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(FindFormula%2C%20ListPlot%2C%20Symbol%2C%20np)%3A%0A%20%20%20%20%23%20Generate%20sinusoidal%20data%0A%20%20%20%20x_trig%20%3D%20Symbol('x')%0A%20%20%20%20x_vals%20%3D%20np.linspace(0%2C%204*np.pi%2C%2050)%0A%20%20%20%20data_trig%20%3D%20%5B%5Bfloat(x)%2C%20float(np.sin(x))%5D%20for%20x%20in%20x_vals%5D%0A%0A%20%20%20%20%23%20Restrict%20to%20trigonometric%20functions%0A%20%20%20%20formula_trig%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20data_trig%2C%20x_trig%2C%0A%20%20%20%20%20%20%20%20target_functions%3D%5B'Sin'%2C%20'Cos'%2C%20'Plus'%2C%20'Times'%5D%2C%0A%20%20%20%20%20%20%20%20niterations%3D15%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D10%0A%20%20%20%20)%0A%0A%20%20%20%20plot_trig%20%3D%20ListPlot(data_trig)%0A%20%20%20%20formula_trig%2C%20plot_trig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%204.%20Exponential%20Decay%0A%0A%20%20%20%20Physical%20processes%20often%20follow%20exponential%20laws.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(FindFormula%2C%20ListPlot%2C%20Symbol%2C%20np)%3A%0A%20%20%20%20%23%20Exponential%20decay%3A%20y%20%3D%205%20*%20exp(-0.3%20*%20x)%0A%20%20%20%20x_exp%20%3D%20Symbol('x')%0A%20%20%20%20x_vals_exp%20%3D%20np.linspace(0%2C%2010%2C%2030)%0A%20%20%20%20data_exp%20%3D%20%5B%5Bfloat(x)%2C%20float(5%20*%20np.exp(-0.3%20*%20x))%5D%20for%20x%20in%20x_vals_exp%5D%0A%0A%20%20%20%20formula_exp%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20data_exp%2C%20x_exp%2C%0A%20%20%20%20%20%20%20%20target_functions%3D%5B'Exp'%2C%20'Plus'%2C%20'Times'%5D%2C%0A%20%20%20%20%20%20%20%20niterations%3D20%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D12%0A%20%20%20%20)%0A%0A%20%20%20%20plot_exp%20%3D%20ListPlot(data_exp)%0A%20%20%20%20formula_exp%2C%20plot_exp%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%205.%20Noisy%20Data%0A%0A%20%20%20%20Real-world%20data%20has%20noise.%20FindFormula%20can%20still%20recover%20underlying%20patterns.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(FindFormula%2C%20ListPlot%2C%20Symbol%2C%20np)%3A%0A%20%20%20%20%23%20Linear%20with%20noise%0A%20%20%20%20np.random.seed(42)%0A%20%20%20%20x_noisy%20%3D%20Symbol('x')%0A%20%20%20%20noise%20%3D%20np.random.normal(0%2C%200.5%2C%2030)%0A%20%20%20%20data_noisy%20%3D%20%5B%5Bfloat(i)%2C%20float(2*i%20%2B%201%20%2B%20noise%5Bi%5D)%5D%20for%20i%20in%20range(30)%5D%0A%0A%20%20%20%20formula_noisy%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20data_noisy%2C%20x_noisy%2C%0A%20%20%20%20%20%20%20%20niterations%3D15%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D8%0A%20%20%20%20)%0A%0A%20%20%20%20plot_noisy%20%3D%20ListPlot(data_noisy)%0A%20%20%20%20formula_noisy%2C%20plot_noisy%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.%20Multiple%20Candidate%20Formulas%0A%0A%20%20%20%20Request%20multiple%20formulas%20to%20see%20the%20trade-off%20between%20complexity%20and%20accuracy.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(FindFormula%2C%20Symbol)%3A%0A%20%20%20%20%23%20Get%20multiple%20candidates%0A%20%20%20%20x_multi%20%3D%20Symbol('x')%0A%20%20%20%20data_multi%20%3D%20%5B%5Bi%2C%20i**2%20%2B%202*i%5D%20for%20i%20in%20range(15)%5D%0A%0A%20%20%20%20formulas_multi%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20data_multi%2C%20x_multi%2C%0A%20%20%20%20%20%20%20%20n%3D5%2C%20%20%23%20Return%20up%20to%205%20formulas%0A%20%20%20%20%20%20%20%20niterations%3D20%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D15%0A%20%20%20%20)%0A%0A%20%20%20%20formulas_multi%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%207.%20Getting%20Detailed%20Results%0A%0A%20%20%20%20Use%20%60prop%3D'All'%60%20to%20get%20scores%2C%20errors%2C%20and%20complexity%20for%20each%20candidate.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(FindFormula%2C%20Symbol)%3A%0A%20%20%20%20x_props%20%3D%20Symbol('x')%0A%20%20%20%20data_props%20%3D%20%5B%5Bi%2C%203*i**2%20-%202*i%20%2B%201%5D%20for%20i%20in%20range(-5%2C%2010)%5D%0A%0A%20%20%20%20results%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20data_props%2C%20x_props%2C%0A%20%20%20%20%20%20%20%20n%3D5%2C%0A%20%20%20%20%20%20%20%20prop%3D'All'%2C%0A%20%20%20%20%20%20%20%20niterations%3D20%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D15%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Show%20the%20results%20dictionary%0A%20%20%20%20results%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%208.%20Physics%20Example%3A%20Kepler's%20Third%20Law%0A%0A%20%20%20%20A%20famous%20example%3A%20discovering%20Kepler's%20law%20from%20planetary%20data.%0A%0A%20%20%20%20Kepler's%20third%20law%20states%3A%20%24T%5E2%20%5Cpropto%20a%5E3%24%0A%0A%20%20%20%20Where%20T%20is%20the%20orbital%20period%20and%20a%20is%20the%20semi-major%20axis.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(FindFormula%2C%20Symbol)%3A%0A%20%20%20%20%23%20Planetary%20data%20(approximate)%3A%20%5Bsemi-major%20axis%20(AU)%2C%20period%20(years)%5D%0A%20%20%20%20planets%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%5B0.387%2C%200.241%5D%2C%20%20%20%23%20Mercury%0A%20%20%20%20%20%20%20%20%5B0.723%2C%200.615%5D%2C%20%20%20%23%20Venus%0A%20%20%20%20%20%20%20%20%5B1.000%2C%201.000%5D%2C%20%20%20%23%20Earth%0A%20%20%20%20%20%20%20%20%5B1.524%2C%201.881%5D%2C%20%20%20%23%20Mars%0A%20%20%20%20%20%20%20%20%5B5.203%2C%2011.86%5D%2C%20%20%20%23%20Jupiter%0A%20%20%20%20%20%20%20%20%5B9.537%2C%2029.46%5D%2C%20%20%20%23%20Saturn%0A%20%20%20%20%20%20%20%20%5B19.19%2C%2084.01%5D%2C%20%20%20%23%20Uranus%0A%20%20%20%20%20%20%20%20%5B30.07%2C%20164.8%5D%2C%20%20%20%23%20Neptune%0A%20%20%20%20%5D%0A%0A%20%20%20%20a%20%3D%20Symbol('a')%20%20%23%20semi-major%20axis%0A%0A%20%20%20%20%23%20We're%20looking%20for%20T%20as%20a%20function%20of%20a%0A%20%20%20%20%23%20The%20relationship%20is%20T%20%3D%20a%5E(3%2F2)%20(in%20appropriate%20units)%0A%20%20%20%20kepler_formula%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20planets%2C%20a%2C%0A%20%20%20%20%20%20%20%20target_functions%3D%5B'Power'%2C%20'Times'%2C%20'Plus'%5D%2C%0A%20%20%20%20%20%20%20%20niterations%3D20%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D10%0A%20%20%20%20)%0A%0A%20%20%20%20kepler_formula%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%209.%20Using%20NumPy%20Arrays%0A%0A%20%20%20%20FindFormula%20accepts%20various%20data%20formats%20including%20NumPy%20arrays.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(FindFormula%2C%20Symbol%2C%20np)%3A%0A%20%20%20%20%23%20Using%20(X%2C%20y)%20tuple%20format%0A%20%20%20%20x_np%20%3D%20Symbol('x')%0A%20%20%20%20X%20%3D%20np.linspace(0%2C%205%2C%2050)%0A%20%20%20%20y%20%3D%20np.sqrt(X)%20%2B%200.5%0A%0A%20%20%20%20formula_np%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20(X%2C%20y)%2C%20x_np%2C%0A%20%20%20%20%20%20%20%20target_functions%3D%5B'Sqrt'%2C%20'Plus'%2C%20'Times'%5D%2C%0A%20%20%20%20%20%20%20%20niterations%3D15%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D8%0A%20%20%20%20)%0A%0A%20%20%20%20formula_np%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%2010.%20Combining%20with%20symderive's%20Symbolic%20Tools%0A%0A%20%20%20%20The%20formulas%20returned%20by%20FindFormula%20are%20SymPy%20expressions%20that%20work%0A%20%20%20%20seamlessly%20with%20symderive's%20other%20tools.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(D%2C%20FindFormula%2C%20Integrate%2C%20Simplify%2C%20Symbol)%3A%0A%20%20%20%20%23%20Find%20a%20formula%0A%20%20%20%20x_sym%20%3D%20Symbol('x')%0A%20%20%20%20data_sym%20%3D%20%5B%5Bi%2C%20i**3%20-%20i%5D%20for%20i%20in%20range(-3%2C%204)%5D%0A%0A%20%20%20%20formula_sym%20%3D%20FindFormula(%0A%20%20%20%20%20%20%20%20data_sym%2C%20x_sym%2C%0A%20%20%20%20%20%20%20%20niterations%3D15%2C%0A%20%20%20%20%20%20%20%20max_complexity%3D10%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Now%20use%20symderive's%20symbolic%20tools%20on%20it%0A%20%20%20%20derivative%20%3D%20D(formula_sym%2C%20x_sym)%0A%20%20%20%20integral%20%3D%20Integrate(formula_sym%2C%20x_sym)%0A%20%20%20%20simplified%20%3D%20Simplify(derivative)%0A%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20'formula'%3A%20formula_sym%2C%0A%20%20%20%20%20%20%20%20'derivative'%3A%20simplified%2C%0A%20%20%20%20%20%20%20%20'integral'%3A%20integral%0A%20%20%20%20%7D%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Summary%0A%0A%20%20%20%20%60FindFormula%60%20provides%20a%20powerful%20interface%20for%20symbolic%20regression%3A%0A%0A%20%20%20%20-%20**Basic%20usage**%3A%20%60FindFormula(data%2C%20x)%60%20-%20finds%20the%20best%20formula%0A%20%20%20%20-%20**Multiple%20results**%3A%20%60FindFormula(data%2C%20x%2C%20n%3D5)%60%20-%20returns%20top%20n%20candidates%0A%20%20%20%20-%20**Targeted%20search**%3A%20%60target_functions%3D%5B'Sin'%2C%20'Exp'%2C%20...%5D%60%20-%20restrict%20function%20space%0A%20%20%20%20-%20**Detailed%20output**%3A%20%60prop%3D'All'%60%20-%20get%20scores%2C%20errors%2C%20complexity%0A%20%20%20%20-%20**Performance**%3A%20%60performance_goal%3D'Quality'%60%20for%20more%20thorough%20search%0A%0A%20%20%20%20The%20discovered%20formulas%20integrate%20seamlessly%20with%20symderive's%20symbolic%0A%20%20%20%20computation%20tools%20for%20differentiation%2C%20integration%2C%20and%20simplification.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
3b48afc13847de05aafbd79b77b6c964