import%20marimo%0A%0A__generated_with%20%3D%20%220.13.7%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%0A%20%20%20%20def%20apply_codecut_style(ax%3DNone)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20Apply%20CodeCut%20plot%20styling%20to%20a%20given%20Matplotlib%20Axes.%0A%20%20%20%20%20%20%20%20If%20no%20Axes%20is%20provided%2C%20use%20the%20current%20active%20Axes.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20if%20ax%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20ax%20%3D%20plt.gca()%0A%0A%20%20%20%20%20%20%20%20%23%20Set%20global%20figure%20facecolor%0A%20%20%20%20%20%20%20%20plt.figure(facecolor%3D%22%232F2D2E%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Background%20colors%0A%20%20%20%20%20%20%20%20fig%20%3D%20ax.figure%0A%20%20%20%20%20%20%20%20fig.patch.set_facecolor(%22%232F2D2E%22)%0A%20%20%20%20%20%20%20%20ax.set_facecolor(%22%232F2D2E%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Line%20and%20text%20colors%0A%20%20%20%20%20%20%20%20ax.title.set_color(%22white%22)%0A%20%20%20%20%20%20%20%20ax.xaxis.label.set_color(%22white%22)%0A%20%20%20%20%20%20%20%20ax.yaxis.label.set_color(%22white%22)%0A%20%20%20%20%20%20%20%20ax.tick_params(axis%3D%22x%22%2C%20colors%3D%22white%22)%0A%20%20%20%20%20%20%20%20ax.tick_params(axis%3D%22y%22%2C%20colors%3D%22white%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Spine%20colors%0A%20%20%20%20%20%20%20%20for%20spine%20in%20ax.spines.values()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20spine.set_color(%22white%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Optional%3A%20turn%20off%20grid%0A%20%20%20%20%20%20%20%20ax.grid(False)%0A%0A%20%20%20%20%20%20%20%20return%20ax%0A%20%20%20%20return%20apply_codecut_style%2C%20plt%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Motivation%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20random%0A%20%20%20%20import%20time%0A%0A%20%20%20%20def%20train_model(epochs%2C%20batch_size)%3A%0A%20%20%20%20%20%20%20%20%23%20Simulate%20training%20by%20producing%20a%20score%20based%20on%20epochs%20and%20batch%20size%0A%20%20%20%20%20%20%20%20time.sleep(0.5)%20%20%23%200.5%20second%20delay%20to%20mimic%20compute%20time%0A%20%20%20%20%20%20%20%20random.seed(epochs%20%2B%20batch_size)%0A%20%20%20%20%20%20%20%20return%20%7B%22score%22%3A%20random.uniform(0.7%2C%200.95)%7D%0A%0A%20%20%20%20def%20evaluate_model(model)%3A%0A%20%20%20%20%20%20%20%20return%20model%5B%22score%22%5D%0A%0A%20%20%20%20best_score%20%3D%20float(%22-inf%22)%0A%20%20%20%20best_params%20%3D%20None%0A%0A%20%20%20%20for%20epochs%20in%20%5B10%2C%2050%2C%20100%5D%3A%0A%20%20%20%20%20%20%20%20for%20batch_size%20in%20%5B16%2C%2032%2C%2064%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Training%20model%20with%20epochs%3D%7Bepochs%7D%2C%20batch_size%3D%7Bbatch_size%7D...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20model%20%3D%20train_model(epochs%3Depochs%2C%20batch_size%3Dbatch_size)%0A%20%20%20%20%20%20%20%20%20%20%20%20score%20%3D%20evaluate_model(model)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22--%3E%20Score%3A%20%7Bscore%3A.4f%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20score%20%3E%20best_score%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_score%20%3D%20score%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_params%20%3D%20%7B%22epochs%22%3A%20epochs%2C%20%22batch_size%22%3A%20batch_size%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22--%3E%20New%20best%20score!%20Updated%20best_params%3A%20%7Bbest_params%7D%22)%0A%0A%20%20%20%20print(%22Best%20score%3A%22%2C%20best_score)%0A%20%20%20%20print(%22Best%20params%3A%22%2C%20best_params)%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%23%23%20Setup%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20sklearn.gaussian_process%20import%20GaussianProcessRegressor%0A%20%20%20%20from%20sklearn.gaussian_process.kernels%20import%20ConstantKernel%20as%20C%0A%20%20%20%20from%20sklearn.gaussian_process.kernels%20import%20Matern%2C%20WhiteKernel%0A%20%20%20%20return%20C%2C%20GaussianProcessRegressor%2C%20Matern%2C%20WhiteKernel%2C%20np%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20def%20black_box_function(x)%3A%0A%20%20%20%20%20%20%20%20return%20-%20(np.sin(3*x)%20%2B%200.5%20*%20x)%0A%20%20%20%20return%20(black_box_function%2C)%0A%0A%0A%40app.cell%0Adef%20_(black_box_function%2C%20np)%3A%0A%20%20%20%20X%20%3D%20np.linspace(0%2C%205.5%2C%201000).reshape(-1%2C%201)%0A%20%20%20%20y%20%3D%20black_box_function(X)%0A%20%20%20%20return%20X%2C%20y%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20apply_codecut_style%2C%20plt%2C%20y)%3A%0A%20%20%20%20plt.plot(X%2C%20y%2C%20%22--%22%2C%20color%3D%22white%22)%0A%20%20%20%20plt.title(%22Black-box%20function%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22f(x)%22)%0A%20%20%20%20apply_codecut_style()%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%23%23%20Brute%20force%20hyperparameter%20search%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(black_box_function%2C%20np)%3A%0A%20%20%20%20X_grid%20%3D%20np.linspace(0%2C%202%2C%20100).reshape(-1%2C%201)%0A%20%20%20%20y_grid%20%3D%20black_box_function(X_grid)%0A%20%20%20%20x_best%20%3D%20X_grid%5Bnp.argmax(y_grid)%5D%0A%20%20%20%20return%20X_grid%2C%20x_best%2C%20y_grid%0A%0A%0A%40app.cell%0Adef%20_(X_grid%2C%20apply_codecut_style%2C%20black_box_function%2C%20plt%2C%20x_best%2C%20y_grid)%3A%0A%20%20%20%20plt.plot(X_grid%2C%20y_grid%2C%20'--'%2C%20color%3D'white'%2C%20label%3D%22True%20function%22)%0A%20%20%20%20plt.scatter(X_grid%2C%20y_grid%2C%20c%3D%22%23E583B6%22%2C%20label%3D%22Evaluated%20Points%22)%0A%20%20%20%20plt.scatter(x_best%2C%20black_box_function(x_best)%2C%20c%3D%22%2372BEFA%22%2C%20s%3D80%2C%20edgecolors%3D%22black%22%2C%20label%3D%22Best%20Point%22)%0A%0A%20%20%20%20plt.title(%22Brute%20Force%20Search%20Over%20Full%20Range%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22f(x)%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20apply_codecut_style()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20def%20train(epochs)%3A%0A%20%20%20%20%23%20%20%20%20%20time.sleep(0.1)%20%20%23%20Simulate%20a%20slow%20training%20step%0A%20%20%20%20%23%20%20%20%20%20return%20black_box_function(epochs)%0A%0A%20%20%20%20%23%20search_space%20%3D%20np.linspace(0%2C%205%2C%201000)%0A%20%20%20%20%23%20results%20%3D%20%5B%5D%0A%0A%20%20%20%20%23%20start%20%3D%20time.time()%0A%20%20%20%20%23%20for%20x%20in%20search_space%3A%0A%20%20%20%20%23%20%20%20%20%20loss%20%3D%20train(x)%0A%20%20%20%20%23%20%20%20%20%20results.append((x%2C%20loss))%0A%20%20%20%20%23%20end%20%3D%20time.time()%0A%0A%20%20%20%20%23%20best_x%20%3D%20search_space%5Bnp.argmin(%5Br%5B1%5D%20for%20r%20in%20results%5D)%5D%0A%20%20%20%20%23%20print(f%22Best%20x%3A%20%7Bbest_x%7D%22)%0A%20%20%20%20%23%20print(%22Time%20taken%3A%22%2C%20round(end%20-%20start%2C%202)%2C%20%22seconds%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%23%23%20Introducing%20Gaussian%20Process%20Regression%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(black_box_function%2C%20np)%3A%0A%20%20%20%20%23%20Initial%20sample%20points%20(simulate%20prior%20evaluations)%0A%20%20%20%20X_sample%20%3D%20np.array(%5B%5B1.0%5D%2C%20%5B3.0%5D%2C%20%5B5.5%5D%5D)%0A%20%20%20%20y_sample%20%3D%20black_box_function(X_sample)%0A%20%20%20%20return%20X_sample%2C%20y_sample%0A%0A%0A%40app.cell%0Adef%20_(C%2C%20GaussianProcessRegressor%2C%20Matern%2C%20WhiteKernel%2C%20X_sample%2C%20y_sample)%3A%0A%20%20%20%20%23%20Define%20the%20kernel%0A%20%20%20%20kernel%20%3D%20C(1.0)%20*%20Matern(length_scale%3D1.0%2C%20nu%3D2.5)%20%2B%20WhiteKernel(noise_level%3D1e-5%2C%20noise_level_bounds%3D(1e-10%2C%201e1))%0A%0A%20%20%20%20%23%20Create%20and%20fit%20the%20Gaussian%20Process%20model%0A%20%20%20%20gpr%20%3D%20GaussianProcessRegressor(kernel%3Dkernel%2C%20alpha%3D0.0)%0A%20%20%20%20gpr.fit(X_sample%2C%20y_sample)%0A%20%20%20%20return%20(gpr%2C)%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20X_sample%2C%20apply_codecut_style%2C%20gpr%2C%20plt%2C%20y%2C%20y_sample)%3A%0A%20%20%20%20%23%20Predict%20across%20the%20domain%0A%20%20%20%20mu%2C%20std%20%3D%20gpr.predict(X%2C%20return_std%3DTrue)%0A%0A%20%20%20%20%23%20Plot%20the%20result%0A%20%20%20%20plt.figure(figsize%3D(10%2C%205))%0A%20%20%20%20plt.plot(X%2C%20y%2C%20%22--%22%2C%20label%3D%22True%20function%22%2C%20color%3D%22white%22)%0A%20%20%20%20plt.plot(X%2C%20mu%2C%20%22-%22%2C%20label%3D%22GPR%20mean%22%2C%20color%3D%22%2372BEFA%22)%0A%20%20%20%20plt.fill_between(X.ravel()%2C%20mu%20-%20std%2C%20mu%20%2B%20std%2C%20alpha%3D0.3%2C%20label%3D%22Uncertainty%22)%0A%20%20%20%20plt.scatter(X_sample%2C%20y_sample%2C%20c%3D%22%23E583B6%22%2C%20label%3D%22Samples%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20plt.title(%22Gaussian%20Process%20Fit%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22f(x)%22)%0A%20%20%20%20apply_codecut_style()%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%23%23%20Bayesian%20Optimization%20Step%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20from%20scipy.stats%20import%20norm%0A%0A%20%20%20%20def%20expected_improvement(X%2C%20X_sample%2C%20y_sample%2C%20model%2C%20xi%3D0.01)%3A%0A%20%20%20%20%20%20%20%20mu%2C%20std%20%3D%20model.predict(X%2C%20return_std%3DTrue)%0A%20%20%20%20%20%20%20%20mu_sample_opt%20%3D%20np.min(y_sample)%0A%0A%20%20%20%20%20%20%20%20with%20np.errstate(divide%3D%22warn%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20imp%20%3D%20mu_sample_opt%20-%20mu%20-%20xi%20%20%23%20because%20we%20are%20minimizing%0A%20%20%20%20%20%20%20%20%20%20%20%20Z%20%3D%20imp%20%2F%20std%0A%20%20%20%20%20%20%20%20%20%20%20%20ei%20%3D%20imp%20*%20norm.cdf(Z)%20%2B%20std%20*%20norm.pdf(Z)%0A%20%20%20%20%20%20%20%20%20%20%20%20ei%5Bstd%20%3D%3D%200.0%5D%20%3D%200.0%0A%0A%20%20%20%20%20%20%20%20return%20ei%0A%0A%20%20%20%20return%20(expected_improvement%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20X%2C%0A%20%20%20%20X_sample%2C%0A%20%20%20%20apply_codecut_style%2C%0A%20%20%20%20expected_improvement%2C%0A%20%20%20%20gpr%2C%0A%20%20%20%20np%2C%0A%20%20%20%20plt%2C%0A%20%20%20%20y_sample%2C%0A)%3A%0A%20%20%20%20ei%20%3D%20expected_improvement(X%2C%20X_sample%2C%20y_sample%2C%20gpr)%0A%0A%20%20%20%20plt.figure(figsize%3D(10%2C%204))%0A%20%20%20%20plt.plot(X%2C%20ei%2C%20label%3D%22Expected%20Improvement%22%2C%20color%3D%22%2372BEFA%22)%0A%20%20%20%20plt.axvline(X%5Bnp.argmax(ei)%5D%2C%20color%3D%22%23E583B6%22%2C%20linestyle%3D%22--%22%2C%20label%3D%22Next%20sample%20point%22)%0A%20%20%20%20plt.title(%22Acquisition%20Function%20(Expected%20Improvement)%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22EI(x)%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20apply_codecut_style()%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%23%23%20Hypeparameter%20Search%20Loop%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20black_box_function%2C%20expected_improvement%2C%20gpr%2C%20np)%3A%0A%20%20%20%20def%20bayesian_optimization(n_iter%3D10)%3A%0A%20%20%20%20%20%20%20%20%23%20Initial%20data%0A%20%20%20%20%20%20%20%20X_sample%20%3D%20np.array(%5B%5B1.0%5D%2C%20%5B2.5%5D%2C%20%5B4.0%5D%5D)%0A%20%20%20%20%20%20%20%20y_sample%20%3D%20black_box_function(X_sample)%0A%0A%20%20%20%20%20%20%20%20for%20_%20in%20range(n_iter)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20gpr.fit(X_sample%2C%20y_sample)%0A%20%20%20%20%20%20%20%20%20%20%20%20ei%20%3D%20expected_improvement(X%2C%20X_sample%2C%20y_sample%2C%20gpr)%0A%20%20%20%20%20%20%20%20%20%20%20%20x_next%20%3D%20X%5Bnp.argmax(ei)%5D.reshape(-1%2C%201)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Evaluate%20the%20function%20at%20the%20new%20point%0A%20%20%20%20%20%20%20%20%20%20%20%20y_next%20%3D%20black_box_function(x_next)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20the%20new%20sample%20to%20our%20dataset%0A%20%20%20%20%20%20%20%20%20%20%20%20X_sample%20%3D%20np.vstack((X_sample%2C%20x_next))%0A%20%20%20%20%20%20%20%20%20%20%20%20y_sample%20%3D%20np.append(y_sample%2C%20y_next)%0A%20%20%20%20%20%20%20%20return%20X_sample%2C%20y_sample%0A%0A%20%20%20%20return%20(bayesian_optimization%2C)%0A%0A%0A%40app.cell%0Adef%20_(bayesian_optimization)%3A%0A%20%20%20%20X_opt%2C%20y_opt%20%3D%20bayesian_optimization(n_iter%3D10)%0A%0A%20%20%20%20return%20X_opt%2C%20y_opt%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20X_opt%2C%20apply_codecut_style%2C%20black_box_function%2C%20plt%2C%20y_opt)%3A%0A%20%20%20%20%23%20Plot%20final%20sampled%20points%0A%20%20%20%20plt.plot(X%2C%20black_box_function(X)%2C%20%22--%22%2C%20label%3D%22True%20function%22%2C%20color%3D%22white%22)%0A%20%20%20%20plt.scatter(X_opt%2C%20y_opt%2C%20c%3D%22%23E583B6%22%2C%20label%3D%22Sampled%20Points%22)%0A%20%20%20%20plt.title(%22Bayesian%20Optimization%20with%20Gaussian%20Process%22)%0A%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20plt.ylabel(%22f(x)%22)%0A%20%20%20%20plt.legend()%0A%20%20%20%20apply_codecut_style()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
62ec410c78d76961c661126e9c0b5b70469d466888b5aba10370a4d2a48db9bc