%23%20%2F%2F%2F%20script%0A%23%20dependencies%20%3D%20%5B%0A%23%20%20%20%20%20%22marimo%22%2C%0A%23%20%20%20%20%20%22matplotlib%3D%3D3.10.8%22%2C%0A%23%20%20%20%20%20%22numpy%3D%3D2.4.2%22%2C%0A%23%20%5D%0A%23%20requires-python%20%3D%20%22%3E%3D3.13%22%0A%23%20%2F%2F%2F%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.20.1%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%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%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20random%20as%20rd%0A%20%20%20%20import%20itertools%20as%20it%0A%0A%20%20%20%20return%20mo%2C%20np%2C%20plt%2C%20rd%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.outline()%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%201D%20Gradient%20Descent%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20f(x)%3A%0A%20%20%20%20%20%20%20%20return%20x**4%20%2F%204.0%20%2B%20x**3%20%2F%203.0%20-%20x**2%20%2B%203.0%0A%0A%0A%20%20%20%20def%20df(x)%3A%0A%20%20%20%20%20%20%20%20return%20x%20*%20(x%20-%201.0)%20*%20(x%20%2B%202.0)%0A%0A%20%20%20%20return%20df%2C%20f%0A%0A%0A%40app.cell%0Adef%20_(f%2C%20np%2C%20plt)%3A%0A%20%20%20%20_xs%20%3D%20np.linspace(-3.0%2C%202.0%2C%20500)%0A%20%20%20%20_%2C%20_rep%20%3D%20plt.subplots()%0A%20%20%20%20_rep.plot(_xs%2C%20f(_xs))%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20gd(x0%2C%20df%2C%20eta)%3A%0A%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20yield%20x0%0A%20%20%20%20%20%20%20%20x0%20%3D%20x0%20-%20eta%20*%20df(x0)%0A%0A%0A%40app.cell%0Adef%20_(df%2C%20f%2C%20np%2C%20plt)%3A%0A%20%20%20%20def%20affichage(x0)%3A%0A%20%20%20%20%20%20%20%20xs%20%3D%20np.linspace(-3.0%2C%202.0%2C%20500)%0A%20%20%20%20%20%20%20%20fig%2C%20rep%20%3D%20plt.subplots()%0A%20%20%20%20%20%20%20%20rep.plot(xs%2C%20f(xs))%0A%20%20%20%20%20%20%20%20nb%20%3D%2010%0A%20%20%20%20%20%20%20%20_as%20%3D%20np.fromiter(gd(x0%2C%20df%2C%200.1)%2C%20dtype%3Dnp.float32%2C%20count%3Dnb)%0A%20%20%20%20%20%20%20%20_bs%20%3D%20f(_as)%0A%20%20%20%20%20%20%20%20sc%20%3D%20rep.scatter(_as%2C%20_bs%2C%20c%3Drange(nb))%0A%20%20%20%20%20%20%20%20fig.colorbar(sc)%0A%20%20%20%20%20%20%20%20return%20fig%0A%0A%20%20%20%20return%20(affichage%2C)%0A%0A%0A%40app.cell%0Adef%20_(affichage)%3A%0A%20%20%20%20affichage(0.5)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(affichage)%3A%0A%20%20%20%20affichage(1.5)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(affichage)%3A%0A%20%20%20%20affichage(-1.0)%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%202D%20Gradient%20Descent%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%23%20Fonction%20de%20Loss%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(f)%3A%0A%20%20%20%20def%20f2(x%2C%20y)%3A%0A%20%20%20%20%20%20%20%20return%20f(x)%20*%20f(y)%0A%0A%20%20%20%20return%20(f2%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20elevation%20%3D%20mo.ui.slider(0%2C%20360%2C%20step%3D10%2C%20label%3D%22elevation%22)%0A%20%20%20%20azimuth%20%3D%20mo.ui.slider(0%2C%20360%2C%20step%3D10%2C%20label%3D%22azimuth%22)%0A%20%20%20%20angle%20%3D%20mo.ui.slider(0%2C%20360%2C%20step%3D10%2C%20label%3D%22angle%22)%0A%20%20%20%20return%20angle%2C%20azimuth%2C%20elevation%0A%0A%0A%40app.cell%0Adef%20_(angle%2C%20azimuth%2C%20elevation%2C%20f2%2C%20mo%2C%20np%2C%20plt)%3A%0A%20%20%20%20_xs%20%3D%20np.linspace(-3.0%2C%202.0%2C%20600)%0A%20%20%20%20_X%2C%20_Y%20%3D%20np.meshgrid(_xs%2C%20_xs)%0A%20%20%20%20_Z%20%3D%20f2(_X%2C%20_Y)%0A%0A%20%20%20%20_fig%2C%20_rep%20%3D%20plt.subplots(figsize%3D(10%2C%207)%2C%20subplot_kw%3D%7B%22projection%22%3A%20%223d%22%7D)%0A%20%20%20%20_rep.plot_surface(_X%2C%20_Y%2C%20_Z%2C%20cmap%3D%22viridis%22)%0A%20%20%20%20_rep.view_init(elevation.value%2C%20azimuth.value%2C%20angle.value)%0A%20%20%20%20mo.hstack(%5B_rep%2C%20mo.vstack(%5Belevation%2C%20azimuth%2C%20angle%5D)%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(f2%2C%20np%2C%20plt)%3A%0A%20%20%20%20_xs%20%3D%20np.linspace(-3.0%2C%202.0%2C%20600)%0A%20%20%20%20_X%2C%20_Y%20%3D%20np.meshgrid(_xs%2C%20_xs)%0A%20%20%20%20_Z%20%3D%20f2(_X%2C%20_Y)%0A%0A%20%20%20%20_fig%2C%20_rep%20%3D%20plt.subplots()%0A%20%20%20%20_rep.contour(_X%2C%20_Y%2C%20_Z%2C%20cmap%3D%22viridis%22%2C%20levels%3Dnp.linspace(0.5%2C%209%2C%2015))%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%23%20Descente%20de%20Gradient%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(df%2C%20f%2C%20np)%3A%0A%20%20%20%20def%20gd2(x0%2C%20y0%2C%20eta)%3A%0A%20%20%20%20%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20yield%20np.array(%5Bx0%2C%20y0%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20x0%20%3D%20x0%20-%20eta%20*%20df(x0)%20*%20f(y0)%0A%20%20%20%20%20%20%20%20%20%20%20%20y0%20%3D%20y0%20-%20eta%20*%20df(y0)%20*%20f(x0)%0A%0A%20%20%20%20return%20(gd2%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20xinit%20%3D%20mo.ui.slider(start%3D-2.5%2C%20stop%3D2%2C%20step%3D0.1%2C%20label%3D%22x0%22%2C%20show_value%3DTrue)%0A%20%20%20%20yinit%20%3D%20mo.ui.slider(start%3D-2.5%2C%20stop%3D2%2C%20step%3D0.1%2C%20label%3D%22y0%22%2C%20show_value%3DTrue)%0A%20%20%20%20nb_etapes%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20start%3D1%2C%20stop%3D20%2C%20step%3D1%2C%20value%3D10%2C%20label%3D%22nombre%20%C3%A9tapes%22%2C%20show_value%3DTrue%0A%20%20%20%20)%0A%20%20%20%20return%20nb_etapes%2C%20xinit%2C%20yinit%0A%0A%0A%40app.cell%0Adef%20_(f2%2C%20gd2%2C%20mo%2C%20nb_etapes%2C%20np%2C%20plt%2C%20xinit%2C%20yinit)%3A%0A%20%20%20%20_xs%20%3D%20np.linspace(-3.0%2C%202.0%2C%20600)%0A%20%20%20%20_X%2C%20_Y%20%3D%20np.meshgrid(_xs%2C%20_xs)%0A%20%20%20%20_Z%20%3D%20f2(_X%2C%20_Y)%0A%0A%20%20%20%20_fig%2C%20_rep%20%3D%20plt.subplots()%0A%20%20%20%20_rep.contour(_X%2C%20_Y%2C%20_Z%2C%20cmap%3D%22viridis%22%2C%20levels%3Dnp.linspace(0.5%2C%209%2C%2015))%0A%0A%0A%20%20%20%20_xs%2C%20_ys%20%3D%20np.fromiter(%0A%20%20%20%20%20%20%20%20gd2(xinit.value%2C%20yinit.value%2C%200.1)%2C%0A%20%20%20%20%20%20%20%20dtype%3Dnp.dtype((np.float32%2C%202))%2C%0A%20%20%20%20%20%20%20%20count%3Dnb_etapes.value%2C%0A%20%20%20%20).T%0A%20%20%20%20_rep.set_title(%22Gradient%20Descent%22)%0A%20%20%20%20_rep.scatter(_xs%5B0%5D%2C%20_ys%5B0%5D%2C%20c%3D%22red%22)%0A%20%20%20%20_rep.plot(_xs%2C%20_ys%2C%20marker%3D%22o%22%2C%20markersize%3D2)%0A%0A%0A%20%20%20%20mo.hstack(%5B_rep%2C%20mo.vstack(%5Bxinit%2C%20yinit%2C%20nb_etapes%5D)%5D)%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%23%20Version%20avec%20Moment%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(df%2C%20f%2C%20np)%3A%0A%20%20%20%20def%20gdm(x0%2C%20y0%2C%20eta%2C%20beta)%3A%0A%20%20%20%20%20%20%20%20mx%20%3D%200.0%0A%20%20%20%20%20%20%20%20my%20%3D%200.0%0A%20%20%20%20%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20yield%20np.array(%5Bx0%2C%20y0%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20mx%20%3D%20beta%20*%20mx%20%2B%20(1%20-%20beta)%20*%20df(x0)%20*%20f(y0)%0A%20%20%20%20%20%20%20%20%20%20%20%20my%20%3D%20beta%20*%20my%20%2B%20(1%20-%20beta)%20*%20df(y0)%20*%20f(x0)%0A%20%20%20%20%20%20%20%20%20%20%20%20x0%20%3D%20x0%20-%20eta%20*%20mx%0A%20%20%20%20%20%20%20%20%20%20%20%20y0%20%3D%20y0%20-%20eta%20*%20my%0A%0A%20%20%20%20return%20(gdm%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20xinit_momentum%20%3D%20mo.ui.slider(start%3D-2.5%2C%20stop%3D2%2C%20step%3D0.1%2C%20label%3D%22x0%22%2C%20show_value%3DTrue)%0A%20%20%20%20yinit_momentum%20%3D%20mo.ui.slider(start%3D-2.5%2C%20stop%3D2%2C%20step%3D0.1%2C%20label%3D%22y0%22%2C%20show_value%3DTrue)%0A%20%20%20%20nb_etapes_momentum%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20start%3D1%2C%20stop%3D100%2C%20step%3D1%2C%20value%3D10%2C%20label%3D%22nombre%20%C3%A9tapes%22%2C%20show_value%3DTrue%0A%20%20%20%20)%0A%20%20%20%20return%20nb_etapes_momentum%2C%20xinit_momentum%2C%20yinit_momentum%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20f2%2C%0A%20%20%20%20gdm%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20nb_etapes_momentum%2C%0A%20%20%20%20np%2C%0A%20%20%20%20plt%2C%0A%20%20%20%20xinit_momentum%2C%0A%20%20%20%20yinit_momentum%2C%0A)%3A%0A%20%20%20%20_xs%20%3D%20np.linspace(-3.0%2C%202.0%2C%20600)%0A%20%20%20%20_X%2C%20_Y%20%3D%20np.meshgrid(_xs%2C%20_xs)%0A%20%20%20%20_Z%20%3D%20f2(_X%2C%20_Y)%0A%0A%20%20%20%20_fig%2C%20_rep%20%3D%20plt.subplots()%0A%20%20%20%20_rep.contour(_X%2C%20_Y%2C%20_Z%2C%20cmap%3D%22viridis%22%2C%20levels%3Dnp.linspace(0.5%2C%209%2C%2015))%0A%0A%0A%20%20%20%20_xs%2C%20_ys%20%3D%20np.fromiter(%0A%20%20%20%20%20%20%20%20gdm(xinit_momentum.value%2C%20yinit_momentum.value%2C%20eta%3D0.1%2C%20beta%3D0.1)%2C%0A%20%20%20%20%20%20%20%20dtype%3Dnp.dtype((np.float32%2C%202))%2C%0A%20%20%20%20%20%20%20%20count%3Dnb_etapes_momentum.value%2C%0A%20%20%20%20).T%0A%20%20%20%20_rep.set_title(%22Momentum%20version%22)%0A%20%20%20%20_rep.scatter(_xs%5B0%5D%2C%20_ys%5B0%5D%2C%20c%3D%22red%22)%0A%20%20%20%20_rep.plot(_xs%2C%20_ys%2C%20marker%3D%22o%22%2C%20markersize%3D2)%0A%0A%0A%20%20%20%20mo.hstack(%5B_rep%2C%20mo.vstack(%5Bxinit_momentum%2C%20yinit_momentum%2C%20nb_etapes_momentum%5D)%5D)%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%20Stochastic%20Gradient%20Descent%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20Poly%3A%0A%20%20%20%20def%20__init__(self%2C%20a%2C%20b%2C%20c)%3A%0A%20%20%20%20%20%20%20%20(self.a%2C%20self.b%2C%20self.c)%20%3D%20sorted(%5Ba%2C%20b%2C%20c%5D)%0A%20%20%20%20%20%20%20%20self.params%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%201.0%20%2F%204.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20-(a%20%2B%20b%20%2B%20c)%20%2F%203.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(a%20*%20b%20%2B%20a%20*%20c%20%2B%20b%20*%20c)%20%2F%202.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20-a%20*%20b%20*%20c%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20self.offset%20%3D%200.0%0A%20%20%20%20%20%20%20%20if%20(b%20-%20a)%20%3C%20(c%20-%20b)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.offset%20%3D%20self(c)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.offset%20%3D%20self(a)%0A%0A%20%20%20%20def%20__str__(self)%3A%0A%20%20%20%20%20%20%20%20return%20f%22a%3D%7Bself.a%7D%20b%3D%7Bself.b%7D%20c%3D%7Bself.c%7D%22%0A%0A%20%20%20%20def%20__call__(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%22%22%22M%C3%A9thode%20d'Horner%20pour%20%C3%A9valuer%22%22%22%0A%20%20%20%20%20%20%20%20coeffs%20%3D%20iter(self.params)%0A%20%20%20%20%20%20%20%20resultat%20%3D%20next(coeffs)%20*%20x%20%2B%20next(coeffs)%0A%20%20%20%20%20%20%20%20for%20p%20in%20coeffs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20resultat%20%3D%20resultat%20*%20x%20%2B%20p%0A%20%20%20%20%20%20%20%20return%20resultat%20-%20self.offset%0A%0A%20%20%20%20def%20grad(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20return%20(x%20-%20self.a)%20*%20(x%20-%20self.b)%20*%20(x%20-%20self.c)%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%23%20Generation%20of%2020%20loss%20functions.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20nb_termes%20%3D%2020%0A%20%20%20%20loss_functions%20%3D%20%5B%0A%20%20%20%20%20%20%20%20Poly(np.random.rand()%20-%201.5%2C%20np.random.rand()%20-%200.5%2C%20np.random.rand()%20%2B%200.5)%0A%20%20%20%20%20%20%20%20for%20_%20in%20range(nb_termes)%0A%20%20%20%20%5D%0A%20%20%20%20return%20loss_functions%2C%20nb_termes%0A%0A%0A%40app.cell%0Adef%20_(loss_functions%2C%20np%2C%20plt)%3A%0A%20%20%20%20_fig%2C%20_reps%20%3D%20plt.subplots(ncols%3D4%2C%20nrows%3D5%2C%20sharex%3DTrue%2C%20sharey%3DTrue%2C%20figsize%3D(16%2C%2020))%0A%0A%20%20%20%20_xs%20%3D%20np.linspace(-1.5%2C%201.5%2C%20300)%0A%20%20%20%20for%20_p%2C%20_rep%20in%20zip(loss_functions%2C%20_reps.flatten())%3A%0A%20%20%20%20%20%20%20%20_rep.plot(_xs%2C%20_p(_xs))%0A%20%20%20%20_fig.suptitle(%22Loss%20functions%22)%0A%20%20%20%20_fig%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%23%20Global%20loss%20function%0A%0A%20%20%20%20It%20is%20the%20mean%20value%20of%20the%2020%20loss%20functions%20above.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(loss_functions%2C%20nb_termes%2C%20np%2C%20plt)%3A%0A%20%20%20%20_fig%2C%20_rep%20%3D%20plt.subplots()%0A%0A%20%20%20%20_xs%20%3D%20np.linspace(-1.5%2C%201.5%2C%20300)%0A%0A%20%20%20%20_ys%20%3D%20sum(_p(_xs)%20for%20_p%20in%20loss_functions)%20%2F%20nb_termes%0A%20%20%20%20_rep.set_title(%22Global%20loss%20function%22)%0A%20%20%20%20_rep.plot(_xs%2C%20_ys)%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%23%20Exploration%20Gradient%20Stochastique%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(loss_functions%2C%20np%2C%20rd)%3A%0A%20%20%20%20def%20sgd(lr%2C%20epochs%2C%20batchsize)%3A%0A%20%20%20%20%20%20%20%20local_losses%20%3D%20%5Bp%20for%20p%20in%20loss_functions%5D%0A%20%20%20%20%20%20%20%20x0%20%3D%20np.random.rand()%0A%20%20%20%20%20%20%20%20for%20_%20in%20range(epochs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20rd.shuffle(local_losses)%0A%20%20%20%20%20%20%20%20%20%20%20%20losses%20%3D%20iter(local_losses)%0A%20%20%20%20%20%20%20%20%20%20%20%20yield%20x0%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ps%20%3D%20%5Bnext(losses)%20for%20_%20in%20range(batchsize)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20except%20StopIteration%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gradient%20%3D%20sum(p.grad(x0)%20for%20p%20in%20ps)%20%2F%20batchsize%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x0%20%3D%20x0%20-%20lr%20*%20gradient%0A%0A%20%20%20%20return%20(sgd%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20epochs%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20start%3D10%2C%20stop%3D1000%2C%20step%3D10%2C%20value%3D450%2C%20label%3D%22epochs%22%2C%20show_value%3DTrue%0A%20%20%20%20)%0A%20%20%20%20lr%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20start%3D0.001%2C%20stop%3D1.0%2C%20step%3D0.005%2C%20value%3D0.7%2C%20label%3D%22learning%20rate%22%2C%20show_value%3DTrue%0A%20%20%20%20)%0A%20%20%20%20return%20epochs%2C%20lr%0A%0A%0A%40app.cell%0Adef%20_(epochs%2C%20loss_functions%2C%20lr%2C%20mo%2C%20nb_termes%2C%20np%2C%20plt%2C%20sgd)%3A%0A%20%20%20%20_fig%2C%20_rep%20%3D%20plt.subplots()%0A%0A%20%20%20%20_xs%20%3D%20np.linspace(-1.5%2C%201.5%2C%20300)%0A%0A%20%20%20%20_ys%20%3D%20sum(_p(_xs)%20for%20_p%20in%20loss_functions)%20%2F%20nb_termes%0A%20%20%20%20_rep.set_title(%22Global%20loss%20function%22)%0A%20%20%20%20_rep.plot(_xs%2C%20_ys)%0A%20%20%20%20_ps%20%3D%20np.fromiter(sgd(lr%3Dlr.value%2C%20epochs%3Depochs.value%2C%20batchsize%3D4)%2C%20dtype%3Dnp.float32)%0A%20%20%20%20_qs%20%3D%20sum(_p(_ps)%20for%20_p%20in%20loss_functions)%20%2F%20nb_termes%0A%20%20%20%20_sc%20%3D%20_rep.scatter(_ps%2C%20_qs%2C%20c%3Drange(epochs.value))%0A%20%20%20%20_fig.colorbar(_sc)%0A%20%20%20%20mo.hstack(%5B_rep%2C%20mo.vstack(%5Blr%2C%20epochs%5D)%5D)%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
24039de560e8c65b0989fbe61f897483