import%20marimo%0A%0A__generated_with%20%3D%20%220.6.13%22%0Aapp%20%3D%20marimo.App(width%3D%22full%22)%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20from%20regression%20import%20FeatureRidgeRegression%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20keras%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20scipy.linalg%20import%20sqrtm%0A%20%20%20%20import%20polars%20as%20pl%0A%20%20%20%20from%20pyobsplot%20import%20Plot%2C%20js%0A%20%20%20%20from%20tqdm.keras%20import%20TqdmCallback%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20FeatureRidgeRegression%2C%0A%20%20%20%20%20%20%20%20Plot%2C%0A%20%20%20%20%20%20%20%20TqdmCallback%2C%0A%20%20%20%20%20%20%20%20js%2C%0A%20%20%20%20%20%20%20%20keras%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%20%20%20%20pl%2C%0A%20%20%20%20%20%20%20%20plt%2C%0A%20%20%20%20%20%20%20%20sqrtm%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20__(FeatureRidgeRegression%2C%20Plot%2C%20js%2C%20keras%2C%20np%2C%20pl%2C%20plt)%3A%0A%20%20%20%20def%20rational_log_space(max_val%2C%20denom%3D10%2C%20num_val%3D100)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20Create%20a%20logarithmic%20space%20with%20rational%20numbers.%0A%20%20%20%20%20%20%20%20%3Aparam%20max_val%3A%20Maximum%20value%20of%20the%20space.%0A%20%20%20%20%20%20%20%20%3Aparam%20denom%3A%20Denominator%20of%20the%20rational%20numbers.%0A%20%20%20%20%20%20%20%20%3Aparam%20num_val%3A%20Number%20of%20values%20in%20the%20space.%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20The%20logarithmic%20space.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20return%20(np.unique(np.geomspace(1%2C%20max_val%20*%20denom%20%2B%201%2C%20num_val%2C%20dtype%3Dint))%20-%201)%20%2F%20denom%0A%0A%0A%20%20%20%20def%20rational_pow_space(max_val%2C%20denom%3D10%2C%20power%3D2%2C%20num_val%3D100)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20Create%20a%20power%20space%20with%20rational%20numbers.%0A%20%20%20%20%20%20%20%20%3Aparam%20max_val%3A%20Maximum%20value%20of%20the%20space.%0A%20%20%20%20%20%20%20%20%3Aparam%20denom%3A%20Denominator%20of%20the%20rational%20numbers.%0A%20%20%20%20%20%20%20%20%3Aparam%20power%3A%20Power%20of%20the%20space.%0A%20%20%20%20%20%20%20%20%3Aparam%20num_val%3A%20Number%20of%20values%20in%20the%20space.%0A%20%20%20%20%20%20%20%20%3Areturn%3A%20The%20power%20space.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20return%20np.unique(np.round(np.linspace(0%2C%20(max_val%20*%20denom)%20**%20(1%20%2F%20power)%2C%20num_val)%20**%20power))%20%2F%20denom%0A%0A%0A%20%20%20%20def%20normalize(images)%3A%0A%20%20%20%20%20%20%20%20mz%20%3D%20images%20-%20np.mean(images%2C%20axis%3D0)%0A%20%20%20%20%20%20%20%20return%20mz%20%2F%20mz.std()%0A%0A%0A%20%20%20%20def%20random_split(prop%2C%20images%2C%20labels)%3A%0A%20%20%20%20%20%20%20%20rng%20%3D%20np.random.default_rng()%0A%20%20%20%20%20%20%20%20choice%20%3D%20rng.choice(list(prop.keys())%2C%20p%3Dlist(prop.values())%2C%20size%3Dlen(labels))%0A%20%20%20%20%20%20%20%20return%20%7Bk%3A%20(images%5Bchoice%20%3D%3D%20k%5D%2C%20labels%5Bchoice%20%3D%3D%20k%5D)%20for%20k%20in%20prop.keys()%7D%0A%0A%0A%20%20%20%20class%20SaveFeatures(keras.callbacks.Callback)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20save_callback)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.log%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.n_epochs%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20self.n_steps%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20self.save_callback%20%3D%20save_callback%0A%0A%20%20%20%20%20%20%20%20def%20save(self)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20res%20%3A%3D%20self.save_callback(self.model%2C%20n_epoch%3Dself.n_epochs%2C%20n_step%3Dself.n_steps)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.log.append(res)%0A%0A%20%20%20%20%20%20%20%20def%20on_epoch_begin(self%2C%20epoch%2C%20logs%3DNone)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.n_epochs%20%3D%20epoch%0A%20%20%20%20%20%20%20%20%20%20%20%20self.n_steps%20%3D%200%0A%0A%20%20%20%20%20%20%20%20def%20on_train_batch_begin(self%2C%20batch%2C%20logs%3DNone)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.save()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.n_steps%20%2B%3D%201%0A%0A%20%20%20%20%20%20%20%20def%20on_train_end(self%2C%20logs%3DNone)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.n_epochs%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20self.n_steps%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20self.save()%0A%0A%0A%20%20%20%20def%20train_model(model%2C%20train_data%2C%20test_data%2C%20n_epochs%3D10%2C%20batch_size%3D32%2C%20n_callbacks%3D10%2C%20callbacks%3DNone%2C%20verbose%3D0%2C%20patience%3D10)%3A%0A%20%20%20%20%20%20%20%20num_steps%20%3D%20np.ceil(len(train_data%5B1%5D)%20%2F%20batch_size)%0A%20%20%20%20%20%20%20%20model.compile(optimizer%3D%22adam%22%2C%20loss%3D%22mean_squared_error%22)%0A%20%20%20%20%20%20%20%20callbacks%20%3D%20callbacks%20or%20dict()%0A%20%20%20%20%20%20%20%20callback_steps%20%3D%20rational_log_space(n_epochs%2C%20denom%3Dnum_steps%2C%20num_val%3Dn_callbacks)%0A%0A%20%20%20%20%20%20%20%20def%20save_callback(keras_model%2C%20n_epoch%3D0%2C%20n_step%3D0)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20n_epoch%20%2B%20n_step%20%2F%20num_steps%20not%20in%20callback_steps%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20acc%20%3D%20keras_model.evaluate(*test_data%2C%20verbose%3Dverbose)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%22loss%22%3A%20acc%2C%20%22epoch%22%3A%20n_epoch%2C%20%22step%22%3A%20n_step%2C%20%22epoch%2Bstep%22%3A%20n_epoch%20%2B%20n_step%20%2F%20num_steps%2C%20%22type%22%3A%20%22NN%22%7D%20%7C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20fun(keras_model)%20for%20name%2C%20fun%20in%20callbacks.items()%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20regression_objs%20%3D%20SaveFeatures(save_callback)%0A%20%20%20%20%20%20%20%20history%20%3D%20keras.callbacks.History()%0A%0A%20%20%20%20%20%20%20%20model.fit(%0A%20%20%20%20%20%20%20%20%20%20%20%20*train_data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20epochs%3Dn_epochs%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20validation_data%3Dtest_data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3Dbatch_size%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20verbose%3Dverbose%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20shuffle%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20callbacks%3D%5Bregression_objs%2C%20history%2C%20keras.callbacks.EarlyStopping(patience%3Dpatience)%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20return%20regression_objs.log%2C%20history.history%0A%0A%0A%20%20%20%20def%20regression_from_model(model%2C%20train_data%2C%20test_data%2C%20emp_avg_data%2C%20empirical%3DTrue)%3A%0A%20%20%20%20%20%20%20%20fun%20%3D%20FeatureRidgeRegression.empirical%20if%20empirical%20else%20FeatureRidgeRegression.linearized%0A%20%20%20%20%20%20%20%20return%20fun(%0A%20%20%20%20%20%20%20%20%20%20%20%20model%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20train_data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20test_data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20emp_avg_data%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%0A%20%20%20%20def%20filter_imgs(images%2C%20labels%2C%20class_names%2C%20class_map)%3A%0A%20%20%20%20%20%20%20%20filtered_idx%20%3D%20%5Bi%20for%20i%2C%20label%20in%20enumerate(labels)%20if%20class_names%5Blabel%5D%20in%20class_map%5D%0A%20%20%20%20%20%20%20%20return%20images%5Bfiltered_idx%5D%2C%20np.array(%5Bclass_map%5Bclass_names%5Blabel%5D%5D%20for%20label%20in%20labels%5Bfiltered_idx%5D%5D)%0A%0A%0A%20%20%20%20def%20get_data(%0A%20%20%20%20%20%20%20%20name%3D%22fashion-MNIST%22%2C%0A%20%20%20%20%20%20%20%20class_map%3DNone%2C%0A%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20if%20class_map%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20class_map%20%3D%20%7B%22Shirt%22%3A%20-1%2C%20%22T-shirt%2Ftop%22%3A%20-1%2C%20%22Pullover%22%3A%201%2C%20%22Coat%22%3A%201%7D%0A%20%20%20%20%20%20%20%20if%20name%20%3D%3D%20%22fashion-MNIST%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20fashion_mnist%20%3D%20keras.datasets.fashion_mnist%0A%20%20%20%20%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(train_images%2C%20train_labels)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(test_images%2C%20test_labels)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%20%3D%20fashion_mnist.load_data()%0A%20%20%20%20%20%20%20%20%20%20%20%20images%20%3D%20np.concatenate(%5Btrain_images%2C%20test_images%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20labels%20%3D%20np.concatenate(%5Btrain_labels%2C%20test_labels%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20class_names%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22T-shirt%2Ftop%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Trouser%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Pullover%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Dress%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Coat%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Sandal%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Shirt%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Sneaker%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Bag%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Ankle%20boot%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20filter_imgs(images%2C%20labels%2C%20class_names%2C%20class_map)%0A%20%20%20%20%20%20%20%20if%20name%20%3D%3D%20%22MNIST%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mnist%20%3D%20keras.datasets.mnist%0A%20%20%20%20%20%20%20%20%20%20%20%20(train_images%2C%20train_labels)%2C%20(test_images%2C%20test_labels)%20%3D%20mnist.load_data()%0A%20%20%20%20%20%20%20%20%20%20%20%20images%20%3D%20np.concatenate(%5Btrain_images%2C%20test_images%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20labels%20%3D%20np.concatenate(%5Btrain_labels%2C%20test_labels%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20class_names%20%3D%20list(range(10))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20filter_imgs(images%2C%20labels%2C%20class_names%2C%20class_map)%0A%20%20%20%20%20%20%20%20raise%20ValueError(%22Unsupported%20Dataset%22)%0A%0A%20%20%20%20def%20regressions(%0A%20%20%20%20%20%20%20%20model%2C%0A%20%20%20%20%20%20%20%20train_w_data%3DNone%2C%0A%20%20%20%20%20%20%20%20train_data%3DNone%2C%0A%20%20%20%20%20%20%20%20emp_avg_data%3DNone%2C%0A%20%20%20%20%20%20%20%20test_data%3DNone%2C%0A%20%20%20%20%20%20%20%20n_epochs%3D50%2C%0A%20%20%20%20%20%20%20%20batch_size%3D128%2C%0A%20%20%20%20%20%20%20%20n_callbacks%3D50%2C%0A%20%20%20%20%20%20%20%20empirical%3DTrue%2C%0A%20%20%20%20%20%20%20%20linearized%3DFalse%2C%0A%20%20%20%20%20%20%20%20patience%3D10%0A%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20linear_model%20%3D%20keras.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.Input(shape%3Dtrain_data%5B0%5D.shape%5B1%3A%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Flatten()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Dense(1%2C%20use_bias%3DFalse)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20linear_model.compile(%0A%20%20%20%20%20%20%20%20%20%20%20%20optimizer%3D%22adam%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20loss%3D%22mean_squared_error%22%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20callbacks%20%3D%20%7B%7D%0A%20%20%20%20%20%20%20%20if%20empirical%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20callbacks%5B%22emp%22%5D%20%3D%20lambda%20model%3A%20regression_from_model(model%2C%20train_data%2C%20test_data%2C%20emp_avg_data%2C%20empirical%3DTrue)%0A%20%20%20%20%20%20%20%20if%20linearized%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20callbacks%5B%22lin%22%5D%20%3D%20lambda%20model%3A%20regression_from_model(model%2C%20train_data%2C%20test_data%2C%20emp_avg_data%2C%20empirical%3DFalse)%0A%0A%20%20%20%20%20%20%20%20NNregressions%2C%20history%20%3D%20train_model(%0A%20%20%20%20%20%20%20%20%20%20%20%20model%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20train_w_data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20test_data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3Dn_epochs%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3Dbatch_size%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_callbacks%3Dn_callbacks%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20callbacks%3Dcallbacks%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20patience%3Dpatience%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20Plot.plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Plot.lineY(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pl.DataFrame(history).with_columns(pl.Series(%22epoch%22%2C%20range(len(history%5B%22loss%22%5D)))).melt(id_vars%3D%22epoch%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dict(x%3D%22epoch%22%2C%20y%3D%22value%22%2C%20stroke%3Djs(%22d%3D%3Ed.variable%3D%3D'loss'%3F'Train'%3A'Test'%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20%22Training%20History%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%22legend%22%3A%20True%2C%20%22type%22%3A%20%22categorical%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22Loss%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22label%22%3A%20%22Epoch%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20format%3D%22html%22%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20lin_regressions%20%3D%20%5B%7B%22type%22%3A%20%22Linear%20Regression%22%7D%20%7C%20%7Bkey%3A%20value(linear_model)%20for%20(key%2C%20value)%20in%20callbacks.items()%7D%5D%0A%0A%20%20%20%20%20%20%20%20return%20NNregressions%20%2B%20lin_regressions%0A%0A%20%20%20%20def%20df_from_regressions(regression_objs%2C%20dictionary)%3A%0A%20%20%20%20%20%20%20%20frames%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20elmnt%20in%20regression_objs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20frame%20%3D%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20key%2C%20val%20in%20dictionary.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new_frame%20%3D%20elmnt%5Bkey%5D.learningCurve(**val)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new_frame%20%3D%20new_frame.rename(%7Bname%3A%20f%22%7Bname%7D_%7Bkey%7D%22%20for%20name%20in%20%5B%22genErrRMT%22%2C%20%22genErrEmp%22%5D%20if%20name%20in%20new_frame.columns%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20frame%20%3D%20frame.join(new_frame%2C%20on%3D(%22n%22%2C%20%22lamb%22))%20if%20frame%20is%20not%20None%20else%20new_frame%0A%20%20%20%20%20%20%20%20%20%20%20%20frames.append(frame.with_columns(%5Bpl.lit(val).alias(key)%20for%20key%2C%20val%20in%20elmnt.items()%20if%20isinstance(val%2C%20(float%2C%20int%2C%20str))%5D))%0A%20%20%20%20%20%20%20%20return%20pl.concat(frames%2C%20how%3D%22diagonal_relaxed%22)%0A%0A%20%20%20%20def%20choose(regs%2C%20num)%3A%0A%20%20%20%20%20%20%20%20arr%20%3D%20%5Breg%20for%20reg%20in%20regs%20if%20reg%5B%22type%22%5D%20%3D%3D%20%22NN%22%5D%0A%20%20%20%20%20%20%20%20return%20%5Blist(arr)%5Bi%5D%20for%20i%20in%20np.round(np.linspace(0%2C%20len(arr)%20-%201%2C%20num)).astype(int)%5D%20%2B%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20reg%20for%20reg%20in%20regs%20if%20reg%5B%22type%22%5D%20%3D%3D%20%22Linear%20Regression%22%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20def%20plot_imgs(imgs%2C%20labels%3DNone)%3A%0A%20%20%20%20%20%20%20%20plt.figure(figsize%3D(6%2C%206))%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(25)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20plt.subplot(5%2C%205%2C%20i%20%2B%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20plt.xticks(%5B%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20plt.yticks(%5B%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20plt.grid(False)%0A%20%20%20%20%20%20%20%20%20%20%20%20plt.imshow(imgs%5Bi%5D%2C%20cmap%3Dplt.cm.binary)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20labels%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plt.xlabel(labels%5Bi%5D)%0A%20%20%20%20%20%20%20%20plt.show()%0A%0A%20%20%20%20format_options%20%3D%20%7B%22font%22%3A%20%22SF%20Pro%20Display%22%2C%20%22margin%22%3A%20%220pt%22%7D%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20SaveFeatures%2C%0A%20%20%20%20%20%20%20%20choose%2C%0A%20%20%20%20%20%20%20%20df_from_regressions%2C%0A%20%20%20%20%20%20%20%20filter_imgs%2C%0A%20%20%20%20%20%20%20%20format_options%2C%0A%20%20%20%20%20%20%20%20get_data%2C%0A%20%20%20%20%20%20%20%20normalize%2C%0A%20%20%20%20%20%20%20%20plot_imgs%2C%0A%20%20%20%20%20%20%20%20random_split%2C%0A%20%20%20%20%20%20%20%20rational_log_space%2C%0A%20%20%20%20%20%20%20%20rational_pow_space%2C%0A%20%20%20%20%20%20%20%20regression_from_model%2C%0A%20%20%20%20%20%20%20%20regressions%2C%0A%20%20%20%20%20%20%20%20train_model%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%22%23%20Real%20Data%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(get_data%2C%20normalize%2C%20plot_imgs%2C%20random_split)%3A%0A%20%20%20%20def%20get_MNIST(class_map)%3A%0A%20%20%20%20%20%20%20%20f_images%2C%20f_labels%20%3D%20get_data(name%3D%22MNIST%22%2C%20class_map%3Dclass_map)%0A%20%20%20%20%20%20%20%20f_images%20%3D%20normalize(f_images)%0A%20%20%20%20%20%20%20%20return%20random_split(%7B%22test%22%3A%200.1%2C%20%22train_reg%22%3A%200.25%2C%20%22train_w%22%3A%200.25%2C%20%22emp_cov%22%3A%200.4%7D%2C%20f_images%2C%20f_labels)%0A%0A%20%20%20%20real_data%20%3D%20get_MNIST(%7Bi%3A%20(1%20if%20i%20%25%202%20%3D%3D%200%20else%20-1)%20for%20i%20in%20range(10)%7D)%0A%20%20%20%20plot_imgs(*real_data%5B%22test%22%5D)%0A%20%20%20%20return%20get_MNIST%2C%20real_data%0A%0A%0A%40app.cell%0Adef%20__(keras%2C%20real_data%2C%20regressions)%3A%0A%20%20%20%20real_regressions%20%3D%20regressions(%0A%20%20%20%20%20%20%20%20keras.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.Input(shape%3Dreal_data%5B%22test%22%5D%5B0%5D.shape%5B1%3A%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Flatten()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Dense(2000%2C%20activation%3D%22relu%22%2C%20use_bias%3DFalse)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Dense(2000%2C%20activation%3D%22relu%22%2C%20use_bias%3DFalse)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Dense(1%2C%20use_bias%3DFalse)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20train_w_data%3Dreal_data%5B%22train_w%22%5D%2C%0A%20%20%20%20%20%20%20%20train_data%3Dreal_data%5B%22train_reg%22%5D%2C%0A%20%20%20%20%20%20%20%20emp_avg_data%3Dreal_data%5B%22emp_cov%22%5D%2C%0A%20%20%20%20%20%20%20%20test_data%3Dreal_data%5B%22test%22%5D%2C%0A%20%20%20%20%20%20%20%20n_epochs%3D100%2C%0A%20%20%20%20%20%20%20%20batch_size%3D128%2C%0A%20%20%20%20%20%20%20%20n_callbacks%3D30%2C%0A%20%20%20%20%20%20%20%20empirical%3DTrue%2C%0A%20%20%20%20%20%20%20%20linearized%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20return%20real_regressions%2C%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%22%23%23%20Fixed%20%24%5Clambda%24%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(choose%2C%20df_from_regressions%2C%20mo%2C%20np%2C%20real_data%2C%20real_regressions)%3A%0A%20%20%20%20df_real_emp%20%3D%20df_from_regressions(%0A%20%20%20%20%20%20%20%20mo.status.progress_bar(choose(real_regressions%2C%205))%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22emp%22%3A%20dict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lambdas%3D%5B0.1%2C%201%2C%2010%2C%20100%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ns%3Dnp.unique(np.geomspace(10%2C%2010_000%2C%20200%2C%20dtype%3Dint))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ns_emp%3Dnp.unique(np.geomspace(10%2C%20len(real_data%5B%22train_reg%22%5D%5B1%5D)%20%2F%202%2C%2010%2C%20dtype%3Dint))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20repeats%3D20%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20df_real_emp%2C%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20df_real_emp%2C%20format_options%2C%20pl)%3A%0A%20%20%20%20_plot_vars%20%3D%20%7B%22x%22%3A%20%22n%22%2C%20%22stroke%22%3A%20%22lamb%22%2C%20%22fx%22%3A%20%22epoch%2Bstep%22%7D%0A%20%20%20%20_df_NN%20%3D%20df_real_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22).filter(pl.col(%22epoch%22)%20%3C%202)%0A%20%20%20%20_df_reg%20%3D%20df_real_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22Linear%20Regression%22)%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(_df_NN%2C%20_plot_vars%20%7C%20%7B%22y%22%3A%20%22genErrRMT_emp%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(_df_reg%2C%20_plot_vars%20%7C%20%7B%22y%22%3A%20%22genErrRMT_emp%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(_df_NN%2C%20_plot_vars%20%7C%20%7B%22y%22%3A%20%22genErrEmp_emp%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(_df_reg%2C%20_plot_vars%20%7C%20%7B%22y%22%3A%20%22genErrEmp_emp%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.ruleY(_df_NN%2C%20%7B%22y%22%3A%20%22loss%22%2C%20%22fx%22%3A%20%22epoch%2Bstep%22%2C%20%22stroke%22%3A%20%22gray%22%7D)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22legend%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22scheme%22%3A%20%22viridis%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22label%22%3A%20%22%CE%BB%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22type%22%3A%20%22log%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20400%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20250%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22domain%22%3A%20%5B0.08%2C%204%5D%2C%20%22label%22%3A%20%22Generalization%20error%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22fx%22%3A%20%7B%22label%22%3A%20%22Epoch%22%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20Plot.plot(%0A%20%20%20%20%20%20%20%20_spec%2C%0A%20%20%20%20%20%20%20%20path%3D%22figures%2Freal_emp_small.pdf%22%2C%0A%20%20%20%20%20%20%20%20format_options%3Dformat_options%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20df_real_emp%2C%20format_options%2C%20pl)%3A%0A%20%20%20%20_plot_vars%20%3D%20%7B%22x%22%3A%20%22n%22%2C%20%22stroke%22%3A%20%22lamb%22%2C%20%22fx%22%3A%20%22epoch%2Bstep%22%7D%0A%20%20%20%20_df_NN%20%3D%20df_real_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%0A%20%20%20%20_df_reg%20%3D%20df_real_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22Linear%20Regression%22)%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(_df_NN%2C%20_plot_vars%20%7C%20%7B%22y%22%3A%20%22genErrRMT_emp%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(_df_reg%2C%20_plot_vars%20%7C%20%7B%22y%22%3A%20%22genErrRMT_emp%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(_df_NN%2C%20_plot_vars%20%7C%20%7B%22y%22%3A%20%22genErrEmp_emp%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(_df_reg%2C%20_plot_vars%20%7C%20%7B%22y%22%3A%20%22genErrEmp_emp%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.ruleY(_df_NN%2C%20%7B%22y%22%3A%20%22loss%22%2C%20%22fx%22%3A%20%22epoch%2Bstep%22%2C%20%22stroke%22%3A%20%22gray%22%7D)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22legend%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22scheme%22%3A%20%22viridis%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22label%22%3A%20%22%CE%BB%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22type%22%3A%20%22log%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20800%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20300%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22domain%22%3A%20%5B0.04%2C%203%5D%2C%20%22label%22%3A%20%22Generalization%20error%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22fx%22%3A%20%7B%22label%22%3A%20%22Epoch%22%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20Plot.plot(%0A%20%20%20%20%20%20%20%20_spec%2C%0A%20%20%20%20%20%20%20%20path%3D%22figures%2Freal_emp.pdf%22%2C%0A%20%20%20%20%20%20%20%20format_options%3Dformat_options%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(df_from_regressions%2C%20mo%2C%20np%2C%20real_regressions)%3A%0A%20%20%20%20df_real_det%20%3D%20df_from_regressions(%0A%20%20%20%20%20%20%20%20mo.status.progress_bar(real_regressions)%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22emp%22%3A%20dict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lambdas%3D%5B0.1%2C%201%2C%2010%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ns%3Dnp.geomspace(10%2C%2010_000%2C%20200%2C%20dtype%3Dint)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20df_real_det%2C%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20df_real_det%2C%20format_options)%3A%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_real_det.sort(%22epoch%2Bstep%22%2C%20descending%3DTrue)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20stroke%3D%22epoch%2Bstep%22%2C%20fx%3D%22lamb%22%2C%20opacity%3D0.8)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%22legend%22%3A%20True%2C%20%22label%22%3A%20%22Epoch%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20800%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20300%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22domain%22%3A%20%5B0%2C%201.2%5D%2C%20%22label%22%3A%20%22Generalization%20error%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22fx%22%3A%20%7B%22label%22%3A%20%22%CE%BB%22%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20path%3D%22figures%2Freal_det.pdf%22%2C%20format_options%3Dformat_options)%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%22%23%23%20Optimal%20%24%5Clambda%24%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(choose%2C%20df_from_regressions%2C%20mo%2C%20np%2C%20real_regressions)%3A%0A%20%20%20%20df_real_opt_emp%20%3D%20df_from_regressions(%0A%20%20%20%20%20%20%20%20mo.status.progress_bar(choose(real_regressions%2C%205))%2C%0A%20%20%20%20%20%20%20%20%7B%22emp%22%3A%20dict(ns%3Dnp.geomspace(30%2C%205000%2C%2050%2C%20dtype%3Dint)%2C%20ns_emp%3Dnp.geomspace(30%2C%205000%2C%2015%2C%20dtype%3Dint)%2C%20repeats%3D5)%7D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20df_real_opt_emp%2C%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20df_real_opt_emp%2C%20format_options%2C%20js%2C%20pl)%3A%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(df_real_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20opacity%3D1%2C%20fx%3D%22epoch%2Bstep%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(df_real_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrEmp_emp%22%2C%20stroke%3D%22lamb%22%2C%20fx%3D%22epoch%2Bstep%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.ruleY(df_real_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%2C%20dict(y%3D%22loss%22%2C%20fx%3D%22epoch%2Bstep%22%2C%20strokeDasharray%3D%5B5%2C%205%5D))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(df_real_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22Linear%20Regression%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20fx%3Djs(%22d%3D%3E'Linear%20Regression'%22)))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(df_real_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22Linear%20Regression%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrEmp_emp%22%2C%20stroke%3D%22lamb%22%2C%20fx%3D%22type%22))%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22domain%22%3A%20%5B0.04%2C%200.8%5D%2C%20%22label%22%3A%20%22Generalization%20error%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22fx%22%3A%20%7B%22label%22%3A%20%22Epoch%22%7D%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20500%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20400%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%22legend%22%3A%20True%2C%20%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%CE%BB%22%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20path%3D%22figures%2Freal_opt_emp.pdf%22%2C%20format_options%3Dformat_options)%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(df_from_regressions%2C%20mo%2C%20np%2C%20real_regressions)%3A%0A%20%20%20%20df_real_opt_det%20%3D%20df_from_regressions(%0A%20%20%20%20%20%20%20%20mo.status.progress_bar(real_regressions)%2C%0A%20%20%20%20%20%20%20%20%7B%22emp%22%3A%20dict(ns%3Dnp.geomspace(30%2C%205000%2C%2050%2C%20dtype%3Dint))%7D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20df_real_opt_det%2C%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20df_real_opt_det%2C%20format_options%2C%20js%2C%20pl)%3A%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_real_opt_det.filter(pl.col(%22type%22)%20%3D%3D%20%22Linear%20Regression%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20opacity%3D1%2C%20strokeDasharray%3D%5B5%2C%205%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_real_opt_det.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20stroke%3D%22epoch%2Bstep%22%2C%20opacity%3Djs(%22d%3D%3Ed.epoch%2Bd.step%3D%3D0%3F1%3A.4%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22domain%22%3A%20%5B0.04%2C%201.1%5D%2C%20%22label%22%3A%20%22Generalization%20error%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22fx%22%3A%20%7B%22label%22%3A%20%22%CE%BB%22%7D%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20300%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20400%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%22legend%22%3A%20True%2C%20%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22Epoch%22%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20path%3D%22figures%2Freal_opt_det.pdf%22%2C%20format_options%3Dformat_options)%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%22%23%20Synthetic%20Data%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(np%2C%20plot_imgs%2C%20random_split%2C%20real_data)%3A%0A%20%20%20%20def%20gen_data(data%2C%20n_samples)%3A%0A%20%20%20%20%20%20%20%20sample_dim%20%3D%20data.shape%5B1%3A%5D%0A%20%20%20%20%20%20%20%20flat_images%20%3D%20data.reshape(data.shape%5B0%5D%2C%20-1)%0A%20%20%20%20%20%20%20%20pop_cov%20%3D%20flat_images.T%20%40%20flat_images%20%2F%20flat_images.shape%5B0%5D%0A%20%20%20%20%20%20%20%20pop_mean%20%3D%20flat_images.mean(axis%3D0)%0A%20%20%20%20%20%20%20%20images_artificial%20%3D%20np.random.multivariate_normal(pop_mean%2C%20pop_cov%2C%20n_samples).reshape(n_samples%2C%20*sample_dim)%0A%0A%20%20%20%20%20%20%20%20w%20%3D%20np.random.normal(0%2C%201%2C%20(images_artificial.shape%5B1%5D%20**%202%2C%20800))%20%2F%20800**0.5%0A%20%20%20%20%20%20%20%20theta%20%3D%20np.random.normal(0%2C%201%2C%20800)%20%2F%20800**0.5%0A%20%20%20%20%20%20%20%20labels_artificial%20%3D%20np.tanh(images_artificial.reshape(images_artificial.shape%5B0%5D%2C%20-1)%20%40%20w)%20%40%20theta%0A%0A%20%20%20%20%20%20%20%20return%20random_split(%7B%22test%22%3A%200.1%2C%20%22train_reg%22%3A%200.1%2C%20%22train_w%22%3A%200.4%2C%20%22emp_cov%22%3A%200.4%7D%2C%20images_artificial%2C%20labels_artificial)%0A%0A%20%20%20%20synth_data%20%3D%20gen_data(real_data%5B%22emp_cov%22%5D%5B0%5D%2C%20100_000)%0A%20%20%20%20plot_imgs(synth_data%5B%22test%22%5D%5B0%5D%2C%20%5Bf%22%7Bx%3A.2f%7D%22%20for%20x%20in%20synth_data%5B%22test%22%5D%5B1%5D%5D)%0A%20%20%20%20return%20gen_data%2C%20synth_data%0A%0A%0A%40app.cell%0Adef%20__(keras%2C%20regressions%2C%20synth_data)%3A%0A%20%20%20%20synth_regressions%20%3D%20regressions(%0A%20%20%20%20%20%20%20%20keras.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.Input(shape%3Dsynth_data%5B%22test%22%5D%5B0%5D.shape%5B1%3A%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Flatten()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Dense(1500%2C%20activation%3D%22tanh%22%2C%20use_bias%3DFalse)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Dense(1400%2C%20activation%3D%22tanh%22%2C%20use_bias%3DFalse)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keras.layers.Dense(1%2C%20use_bias%3DFalse)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20train_w_data%3Dsynth_data%5B%22train_w%22%5D%2C%0A%20%20%20%20%20%20%20%20train_data%3Dsynth_data%5B%22train_reg%22%5D%2C%0A%20%20%20%20%20%20%20%20emp_avg_data%3Dsynth_data%5B%22emp_cov%22%5D%2C%0A%20%20%20%20%20%20%20%20test_data%3Dsynth_data%5B%22test%22%5D%2C%0A%20%20%20%20%20%20%20%20n_epochs%3D100%2C%0A%20%20%20%20%20%20%20%20batch_size%3D256%2C%0A%20%20%20%20%20%20%20%20n_callbacks%3D50%2C%0A%20%20%20%20%20%20%20%20empirical%3DTrue%2C%0A%20%20%20%20%20%20%20%20linearized%3DTrue%2C%0A%20%20%20%20)%0A%20%20%20%20return%20synth_regressions%2C%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%22%23%23%20Fixed%20%24%5Clambda%24%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(choose%2C%20df_from_regressions%2C%20mo%2C%20np%2C%20synth_data%2C%20synth_regressions)%3A%0A%20%20%20%20df_art_emp%20%3D%20df_from_regressions(%0A%20%20%20%20%20%20%20%20mo.status.progress_bar(choose(synth_regressions%2C%205))%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22emp%22%3A%20dict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lambdas%3D%5B0.1%2C%201%2C%2010%2C%20100%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ns%3Dnp.unique(np.geomspace(50%2C%2010_000%2C%20200%2C%20dtype%3Dint))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ns_emp%3Dnp.unique(np.geomspace(50%2C%20len(synth_data%5B%22train_reg%22%5D%5B1%5D)%2C%2010%2C%20dtype%3Dint))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20repeats%3D1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22lin%22%3A%20dict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lambdas%3D%5B0.1%2C%201%2C%2010%2C%20100%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ns%3Dnp.unique(np.geomspace(50%2C%2010_000%2C%20200%2C%20dtype%3Dint))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ns_emp%3Dnp.unique(np.geomspace(50%2C%20len(synth_data%5B%22train_reg%22%5D%5B1%5D)%2C%2010%2C%20dtype%3Dint))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20repeats%3D1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20df_art_emp%2C%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20df_art_emp%2C%20format_options%2C%20pl)%3A%0A%20%20%20%20_df_NN%20%3D%20df_art_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%0A%20%20%20%20_df_reg%20%3D%20df_art_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22Linear%20Regression%22)%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(_df_NN%2C%20%7B%22x%22%3A%20%22n%22%2C%20%22stroke%22%3A%20%22lamb%22%2C%20%22y%22%3A%20%22genErrRMT_emp%22%2C%20%22fx%22%3A%20%22epoch%2Bstep%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(_df_NN%2C%20%7B%22x%22%3A%20%22n%22%2C%20%22stroke%22%3A%20%22lamb%22%2C%20%22y%22%3A%20%22genErrRMT_lin%22%2C%20%22fx%22%3A%20%22epoch%2Bstep%22%2C%20%22strokeDasharray%22%3A%20%5B5%2C%205%5D%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.ruleY(_df_NN%2C%20%7B%22y%22%3A%20%22loss%22%2C%20%22fx%22%3A%20%22epoch%2Bstep%22%2C%20%22stroke%22%3A%20%22gray%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(_df_NN%2C%20%7B%22x%22%3A%20%22n%22%2C%20%22stroke%22%3A%20%22lamb%22%2C%20%22y%22%3A%20%22genErrEmp_emp%22%2C%20%22fx%22%3A%20%22epoch%2Bstep%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(_df_reg%2C%20%7B%22x%22%3A%20%22n%22%2C%20%22stroke%22%3A%20%22lamb%22%2C%20%22y%22%3A%20%22genErrRMT_emp%22%2C%20%22fx%22%3A%20%22type%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(_df_reg%2C%20%7B%22x%22%3A%20%22n%22%2C%20%22stroke%22%3A%20%22lamb%22%2C%20%22y%22%3A%20%22genErrEmp_emp%22%2C%20%22fx%22%3A%20%22type%22%7D)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%22legend%22%3A%20True%2C%20%22type%22%3A%20%22log%22%2C%20%22scheme%22%3A%20%22viridis%22%2C%20%22label%22%3A%20%22%CE%BB%22%7D%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20800%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20400%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22domain%22%3A%20%5B0.02%2C%201%5D%2C%20%22label%22%3A%20%22Generalization%20error%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22fx%22%3A%20%7B%22label%22%3A%20%22Epoch%22%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20path%3D%22figures%2Fart_emp.pdf%22%2C%20format_options%3Dformat_options)%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(df_from_regressions%2C%20mo%2C%20np%2C%20synth_regressions)%3A%0A%20%20%20%20df_art_det%20%3D%20df_from_regressions(%0A%20%20%20%20%20%20%20%20mo.status.progress_bar(synth_regressions)%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22emp%22%3A%20dict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lambdas%3D%5B0.1%2C%201%2C%2010%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ns%3Dnp.geomspace(10%2C%2010000%2C%20200%2C%20dtype%3Dint)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20df_art_det%2C%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20df_art_det%2C%20format_options)%3A%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_art_det.sort(%22epoch%2Bstep%22%2C%20descending%3DTrue)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20stroke%3D%22epoch%2Bstep%22%2C%20fx%3D%22lamb%22%2C%20opacity%3D0.8)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%22legend%22%3A%20True%2C%20%22label%22%3A%20%22Epoch%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20800%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20500%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22domain%22%3A%20%5B0.02%2C%200.5%5D%2C%20%22label%22%3A%20%22Generalization%20error%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22fx%22%3A%20%7B%22label%22%3A%20%22%CE%BB%22%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20path%3D%22figures%2Fart_det.pdf%22%2C%20format_options%3Dformat_options)%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%22%23%23%20Optimal%20%24%5Clambda%24%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(choose%2C%20df_from_regressions%2C%20mo%2C%20np%2C%20synth_regressions)%3A%0A%20%20%20%20df_art_opt_emp%20%3D%20df_from_regressions(%0A%20%20%20%20%20%20%20%20mo.status.progress_bar(choose(synth_regressions%2C%205))%2C%0A%20%20%20%20%20%20%20%20%7B%22emp%22%3A%20dict(ns%3Dnp.geomspace(30%2C%205000%2C%2050%2C%20dtype%3Dint)%2C%20ns_emp%3Dnp.geomspace(30%2C%205000%2C%2015%2C%20dtype%3Dint)%2C%20repeats%3D5)%7D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20df_art_opt_emp%2C%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20df_art_opt_emp%2C%20format_options%2C%20js%2C%20pl)%3A%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(df_art_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20opacity%3D1%2C%20fx%3D%22epoch%2Bstep%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(df_art_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrEmp_emp%22%2C%20stroke%3D%22lamb%22%2C%20fx%3D%22epoch%2Bstep%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.ruleY(df_art_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%2C%20dict(y%3D%22loss%22%2C%20fx%3D%22epoch%2Bstep%22%2C%20strokeDasharray%3D%5B5%2C%205%5D))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(df_art_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22Linear%20Regression%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20fx%3Djs(%22d%3D%3E'Linear%20Regression'%22)))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(df_art_opt_emp.filter(pl.col(%22type%22)%20%3D%3D%20%22Linear%20Regression%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrEmp_emp%22%2C%20stroke%3D%22lamb%22%2C%20fx%3D%22type%22))%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22domain%22%3A%20%5B0.02%2C%200.3%5D%2C%20%22label%22%3A%20%22Generalization%20error%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22fx%22%3A%20%7B%22label%22%3A%20%22Epoch%22%7D%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20500%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20400%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%22legend%22%3A%20True%2C%20%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%CE%BB%22%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20path%3D%22figures%2Fart_opt_emp.pdf%22%2C%20format_options%3Dformat_options)%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(df_from_regressions%2C%20mo%2C%20np%2C%20synth_regressions)%3A%0A%20%20%20%20df_art_opt_det%20%3D%20df_from_regressions(%0A%20%20%20%20%20%20%20%20mo.status.progress_bar(synth_regressions)%2C%0A%20%20%20%20%20%20%20%20%7B%22emp%22%3A%20dict(ns%3Dnp.geomspace(30%2C%205000%2C%2050%2C%20dtype%3Dint))%7D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20df_art_opt_det%2C%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20df_art_opt_det%2C%20format_options%2C%20js%2C%20pl)%3A%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_art_opt_det.filter(pl.col(%22type%22)%20%3D%3D%20%22Linear%20Regression%22)%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20opacity%3D1%2C%20strokeDasharray%3D%5B5%2C%205%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_art_opt_det.filter(pl.col(%22type%22)%20%3D%3D%20%22NN%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT_emp%22%2C%20stroke%3D%22epoch%2Bstep%22%2C%20opacity%3Djs(%22d%3D%3Ed.epoch%2Bd.step%3D%3D0%3F1%3A.4%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22domain%22%3A%20%5B0.02%2C%200.3%5D%2C%20%22label%22%3A%20%22Generalization%20error%22%2C%20%22type%22%3A%20%22log%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22fx%22%3A%20%7B%22label%22%3A%20%22%CE%BB%22%7D%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20300%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20400%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%22legend%22%3A%20True%2C%20%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22Epoch%22%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20path%3D%22figures%2Fart_opt_det.pdf%22%2C%20format_options%3Dformat_options)%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%22%23%20Random%20Features%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(FeatureRidgeRegression%2C%20np%2C%20sqrtm)%3A%0A%20%20%20%20def%20rf_reg(gamma%2C%20d%3D1000%2C%20n_emp%3D10000%2C%20n_test%3D2000%2C%20n_train%3D2000)%3A%0A%20%20%20%20%20%20%20%20Ws%20%3D%20np.random.normal(0%2C%20d%20**%20(-0.5)%2C%20(d%2C%20d))%20%40%20np.diag(np.linspace(1%2C%20d%2C%20d)%20**%20(-0.3%20%2F%202))%0A%20%20%20%20%20%20%20%20W1%20%3D%200.5%20*%20np.random.normal(0%2C%20d%20**%20(-0.5)%2C%20(d%2C%20d))%20%40%20np.diag(np.linspace(1%2C%20d%2C%20d)%20**%20(-gamma%20%2F%202))%20%2B%200.5%20*%20Ws%0A%20%20%20%20%20%20%20%20C3%20%3D%20np.linalg.inv(W1%20%40%20W1.T%20%2B%200.5%20*%20np.eye(d))%0A%20%20%20%20%20%20%20%20W3%20%3D%20np.random.normal(0%2C%20d%20**%20(-0.5)%2C%20(d%2C%20d))%20%40%20sqrtm(C3)%0A%20%20%20%20%20%20%20%20theta%20%3D%20np.random.normal(0%2C%20d%20**%20(-0.5)%2C%20d)%0A%0A%20%20%20%20%20%20%20%20def%20phis(x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20np.array(%5Btheta%5D)%20%40%20np.tanh(Ws%20%40%20x)%0A%0A%20%20%20%20%20%20%20%20def%20phi(x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20np.tanh(W3%20%40%20np.tanh(W1%20%40%20np.tanh(W1%20%40%20x)))%0A%0A%20%20%20%20%20%20%20%20def%20genData(k)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20np.random.normal(0%2C%201%2C%20(d%2C%20k))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20(phi(x)%2C%20phis(x)%5B0%5D)%0A%0A%20%20%20%20%20%20%20%20(Phi_emp%2C%20phis_emp)%20%3D%20genData(n_emp)%0A%20%20%20%20%20%20%20%20Omega%20%3D%20Phi_emp%20%40%20Phi_emp.T%20%2F%20n_emp%0A%20%20%20%20%20%20%20%20sigma%20%3D%20np.mean(phis_emp**2)%20**%200.5%0A%20%20%20%20%20%20%20%20psi%20%3D%20np.mean(phis_emp%5Bnp.newaxis%5D%20*%20Phi_emp%2C%20axis%3D1)%0A%0A%20%20%20%20%20%20%20%20trainData%20%3D%20genData(n_train)%0A%20%20%20%20%20%20%20%20testData%20%3D%20genData(n_test)%0A%0A%20%20%20%20%20%20%20%20return%20FeatureRidgeRegression(Omega%3DOmega%2C%20sigma%3Dsigma%2C%20psi%3Dpsi%2C%20data%3DtrainData%2C%20test_data%3DtestData)%0A%0A%20%20%20%20rf_regs%20%3D%20%5B%7B%22gamma%22%3A%20gamma%2C%20%22reg%22%3A%20rf_reg(gamma%2C%20d%3D500%2C%20n_emp%3D10_000)%7D%20for%20gamma%20in%20%5B0.01%2C%200.2%2C%200.5%2C%200.8%5D%5D%0A%20%20%20%20return%20rf_reg%2C%20rf_regs%0A%0A%0A%40app.cell%0Adef%20__(Plot%2C%20format_options%2C%20np%2C%20pl%2C%20rf_regs)%3A%0A%20%20%20%20_df_rf%20%3D%20pl.concat(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20entry%5B%22reg%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20.learningCurve(lambdas%3D%5B1e-3%5D%2C%20ns%3Dnp.linspace(50%2C%201000%2C%2050%2C%20dtype%3Dint)%2C%20ns_emp%3Dnp.linspace(50%2C%201000%2C%2010%2C%20dtype%3Dint)%2C%20repeats%3D10)%0A%20%20%20%20%20%20%20%20%20%20%20%20.with_columns(pl.lit(entry%5B%22gamma%22%5D).alias(%22gamma%22))%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20entry%20in%20rf_regs%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20_spec%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22marks%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.line(_df_rf%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrRMT%22%2C%20stroke%3D%22gamma%22%2C%20opacity%3D1))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Plot.dot(_df_rf%2C%20dict(x%3D%22n%22%2C%20y%3D%22genErrEmp%22%2C%20stroke%3D%22gamma%22))%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%22x%22%3A%20%7B%22label%22%3A%20%22%23%20Samples%22%7D%2C%0A%20%20%20%20%20%20%20%20%22y%22%3A%20%7B%22type%22%3A%20%22log%22%2C%20%22label%22%3A%20%22Generalization%20error%22%7D%2C%0A%20%20%20%20%20%20%20%20%22grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%22width%22%3A%20400%2C%0A%20%20%20%20%20%20%20%20%22height%22%3A%20250%2C%0A%20%20%20%20%20%20%20%20%22color%22%3A%20%7B%22legend%22%3A%20True%2C%20%22label%22%3A%20%22%CE%B3%22%2C%20%22scheme%22%3A%20%22viridis%22%2C%20%22domain%22%3A%20%5B-0.1%2C%200.9%5D%7D%2C%0A%20%20%20%20%7D%0A%20%20%20%20Plot.plot(_spec%2C%20path%3D%22figures%2Frf_emp.pdf%22%2C%20format_options%3Dformat_options)%0A%20%20%20%20Plot.plot(_spec%2C%20format%3D%22html%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__()%3A%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