import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%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%20pandas%20as%20pd%0A%20%20%20%20import%20plotly.graph_objects%20as%20go%0A%20%20%20%20from%20plotly.subplots%20import%20make_subplots%0A%20%20%20%20from%20sklearn.datasets%20import%20load_digits%0A%20%20%20%20from%20sklearn.preprocessing%20import%20MinMaxScaler%0A%20%20%20%20import%20torch%0A%20%20%20%20import%20torch.nn%20as%20nn%0A%20%20%20%20import%20torch.optim%20as%20optim%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20MinMaxScaler%2C%0A%20%20%20%20%20%20%20%20go%2C%0A%20%20%20%20%20%20%20%20load_digits%2C%0A%20%20%20%20%20%20%20%20make_subplots%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20nn%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20optim%2C%0A%20%20%20%20%20%20%20%20pd%2C%0A%20%20%20%20%20%20%20%20torch%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%5B%E2%86%90%2058%20PCA%20Anomaly%20Detection%5D(58_pca_for_anomaly_detection.py)%20%7C%20%5BIndex%5D(..%2Findex.html)%20%7C%20%5B60%20VAE%20Anomaly%20Detection%20%E2%86%92%5D(60_vae_anomaly_detection.py)%0A%0A%20%20%20%20%23%2059.%20Variational%20Autoencoders%20(VAEs)%3A%20The%20ELBO%20Objective%2C%20KL%20Divergence%2C%20and%20Generative%20Manifolds%0A%0A%20%20%20%20%23%23%23%20Executive%20Summary%0A%0A%20%20%20%20Deterministic%20autoencoders%20learn%20low-dimensional%20bottleneck%20representations%2C%20but%20their%20unconstrained%20latent%20spaces%20are%20prone%20to%20severe%20discontinuities%2C%20empty%20regions%20(%22holes%22)%2C%20and%20arbitrary%20metric%20geometries%20that%20render%20them%20incapable%20of%20reliable%20generative%20sampling.%0A%0A%20%20%20%20**Variational%20Autoencoders%20(VAEs)**%20(Kingma%20%26%20Welling%2C%202013)%20solve%20this%20limitation%20by%20reframing%20representation%20learning%20as%20probabilistic%20variational%20inference.%20Instead%20of%20mapping%20an%20input%20to%20a%20static%20coordinate%20vector%20%24z%24%2C%20the%20VAE%20encoder%20predicts%20the%20statistical%20parameters%20(mean%20%24%5Cmu%24%20and%20covariance%20%24%5CSigma%24)%20of%20a%20conditional%20probability%20distribution%20%24q_%5Cphi(z%20%5Cmid%20x)%24.%20By%20maximizing%20the%20**Evidence%20Lower%20Bound%20(ELBO)**%2C%20the%20network%20balances%20pixel%20reconstruction%20fidelity%20against%20a%20Kullback-Leibler%20(KL)%20divergence%20penalty%20that%20pulls%20the%20aggregate%20posterior%20toward%20a%20standard%20Gaussian%20prior%20%24%5Cmathcal%7BN%7D(0%2C%20I)%24%2C%20creating%20a%20continuous%2C%20smooth%2C%20and%20generatively%20sampleable%20latent%20manifold.%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%20%5Bb%5D%20Mathematical%20Foundations%20and%20the%20ELBO%20Derivation%0A%0A%20%20%20%20%23%23%23%201.%20The%20Latent%20Variable%20Generative%20Model%0A%0A%20%20%20%20Let%20%24x%20%5Cin%20%5Cmathcal%7BX%7D%24%20be%20an%20observed%20data%20point%20and%20%24z%20%5Cin%20%5Cmathcal%7BZ%7D%20%3D%20%5Cmathbb%7BR%7D%5Ed%24%20be%20an%20unobserved%20continuous%20latent%20variable.%20The%20generative%20process%20assumes%3A%0A%0A%20%20%20%201.%20A%20prior%20distribution%20over%20latent%20codes%3A%20%24p(z)%20%3D%20%5Cmathcal%7BN%7D(0%2C%20I)%24%0A%20%20%20%202.%20A%20conditional%20likelihood%20parameterized%20by%20a%20deep%20neural%20decoder%20with%20weights%20%24%5Ctheta%24%3A%20%24p_%5Ctheta(x%20%5Cmid%20z)%24%0A%0A%20%20%20%20The%20true%20posterior%20distribution%20over%20latent%20codes%20is%20given%20by%20Bayes'%20rule%3A%0A%0A%20%20%20%20%24%24p_%5Ctheta(z%20%5Cmid%20x)%20%3D%20%5Cfrac%7Bp_%5Ctheta(x%20%5Cmid%20z)%20p(z)%7D%7Bp_%5Ctheta(x)%7D%20%3D%20%5Cfrac%7Bp_%5Ctheta(x%20%5Cmid%20z)%20p(z)%7D%7B%5Cint%20p_%5Ctheta(x%20%5Cmid%20z)%20p(z)%20%5C%2C%20dz%7D%24%24%0A%0A%20%20%20%20The%20marginal%20likelihood%20%24p_%5Ctheta(x)%24%20requires%20integrating%20over%20the%20entire%20%24d%24-dimensional%20latent%20space%20%24%5Cmathbb%7BR%7D%5Ed%24%2C%20which%20is%20analytically%20intractable%20for%20non-linear%20neural%20network%20decoders.%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%23%202.%20Variational%20Inference%20and%20the%20Evidence%20Lower%20Bound%20(ELBO)%0A%0A%20%20%20%20To%20circumvent%20the%20intractable%20integral%2C%20we%20introduce%20a%20recognition%20model%20(encoder)%20%24q_%5Cphi(z%20%5Cmid%20x)%24%20parameterized%20by%20weights%20%24%5Cphi%24%20to%20approximate%20the%20true%20posterior%20%24p_%5Ctheta(z%20%5Cmid%20x)%24.%0A%0A%20%20%20%20We%20derive%20the%20Evidence%20Lower%20Bound%20using%20Jensen's%20inequality%20on%20the%20marginal%20log-likelihood%3A%0A%0A%20%20%20%20%24%24%5Cln%20p_%5Ctheta(x)%20%3D%20%5Cln%20%5Cint%20p_%5Ctheta(x%2C%20z)%20%5C%2C%20dz%20%3D%20%5Cln%20%5Cint%20q_%5Cphi(z%20%5Cmid%20x)%20%5Cfrac%7Bp_%5Ctheta(x%2C%20z)%7D%7Bq_%5Cphi(z%20%5Cmid%20x)%7D%20%5C%2C%20dz%24%24%0A%0A%20%20%20%20By%20Jensen's%20inequality%20(%24%5Cln%20%5Cmathbb%7BE%7D%5BY%5D%20%5Cge%20%5Cmathbb%7BE%7D%5B%5Cln%20Y%5D%24)%3A%0A%0A%20%20%20%20%24%24%5Cln%20p_%5Ctheta(x)%20%5Cge%20%5Cmathbb%7BE%7D_%7Bz%20%5Csim%20q_%5Cphi(z%20%5Cmid%20x)%7D%20%5Cleft%5B%20%5Cln%20%5Cfrac%7Bp_%5Ctheta(x%2C%20z)%7D%7Bq_%5Cphi(z%20%5Cmid%20x)%7D%20%5Cright%5D%20%5Cequiv%20%5Cmathcal%7BL%7D_%7B%5Ctext%7BELBO%7D%7D(%5Ctheta%2C%20%5Cphi%3B%20x)%24%24%0A%0A%20%20%20%20Decomposing%20the%20joint%20distribution%20%24p_%5Ctheta(x%2C%20z)%20%3D%20p_%5Ctheta(x%20%5Cmid%20z)%20p(z)%24%3A%0A%0A%20%20%20%20%24%24%5Cmathcal%7BL%7D_%7B%5Ctext%7BELBO%7D%7D(%5Ctheta%2C%20%5Cphi%3B%20x)%20%3D%20%5Cmathbb%7BE%7D_%7Bq_%5Cphi(z%20%5Cmid%20x)%7D%20%5Cleft%5B%20%5Cln%20p_%5Ctheta(x%20%5Cmid%20z)%20%5Cright%5D%20%2B%20%5Cmathbb%7BE%7D_%7Bq_%5Cphi(z%20%5Cmid%20x)%7D%20%5Cleft%5B%20%5Cln%20%5Cfrac%7Bp(z)%7D%7Bq_%5Cphi(z%20%5Cmid%20x)%7D%20%5Cright%5D%24%24%0A%0A%20%20%20%20Recognizing%20the%20negative%20Kullback-Leibler%20divergence%20in%20the%20second%20term%3A%0A%0A%20%20%20%20%24%24%5Cmathcal%7BL%7D_%7B%5Ctext%7BELBO%7D%7D(%5Ctheta%2C%20%5Cphi%3B%20x)%20%3D%20%5Cunderbrace%7B%5Cmathbb%7BE%7D_%7Bz%20%5Csim%20q_%5Cphi(z%20%5Cmid%20x)%7D%20%5Cleft%5B%20%5Cln%20p_%5Ctheta(x%20%5Cmid%20z)%20%5Cright%5D%7D_%7B%5Ctext%7BReconstruction%20Log-Likelihood%7D%7D%20-%20%5Cunderbrace%7BD_%7B%5Ctext%7BKL%7D%7D%5Cleft(%20q_%5Cphi(z%20%5Cmid%20x)%20%5C%2C%5Cparallel%5C%2C%20p(z)%20%5Cright)%7D_%7B%5Ctext%7BLatent%20Prior%20Regularization%7D%7D%24%24%0A%0A%20%20%20%20The%20fundamental%20relationship%20between%20true%20evidence%2C%20the%20ELBO%2C%20and%20posterior%20approximation%20error%20is%3A%0A%0A%20%20%20%20%24%24%5Cln%20p_%5Ctheta(x)%20%3D%20%5Cmathcal%7BL%7D_%7B%5Ctext%7BELBO%7D%7D(%5Ctheta%2C%20%5Cphi%3B%20x)%20%2B%20D_%7B%5Ctext%7BKL%7D%7D%5Cleft(%20q_%5Cphi(z%20%5Cmid%20x)%20%5C%2C%5Cparallel%5C%2C%20p_%5Ctheta(z%20%5Cmid%20x)%20%5Cright)%24%24%0A%0A%20%20%20%20Because%20%24D_%7B%5Ctext%7BKL%7D%7D%20%5Cge%200%24%2C%20maximizing%20the%20ELBO%20simultaneously%3A%0A%20%20%20%201.%20Maximizes%20the%20likelihood%20of%20reconstructing%20the%20data.%0A%20%20%20%202.%20Minimizes%20the%20divergence%20between%20the%20variational%20distribution%20%24q_%5Cphi(z%20%5Cmid%20x)%24%20and%20the%20true%20posterior%20%24p_%5Ctheta(z%20%5Cmid%20x)%24.%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%23%203.%20Closed-Form%20Analytical%20Gaussian%20KL%20Divergence%0A%0A%20%20%20%20Let%20the%20prior%20be%20standard%20multivariate%20normal%20%24p(z)%20%3D%20%5Cmathcal%7BN%7D(0%2C%20I)%24%2C%20and%20let%20the%20encoder%20output%20a%20diagonal%20Gaussian%20posterior%3A%0A%0A%20%20%20%20%24%24q_%5Cphi(z%20%5Cmid%20x)%20%3D%20%5Cmathcal%7BN%7D%5Cleft(%20%5Cmu(x)%2C%20%5Coperatorname%7Bdiag%7D%5Cleft(%20%5Csigma_1%5E2(x)%2C%20%5Cdots%2C%20%5Csigma_d%5E2(x)%20%5Cright)%20%5Cright)%24%24%0A%0A%20%20%20%20The%20KL%20divergence%20between%20two%20multivariate%20Gaussians%20has%20an%20exact%20closed-form%20solution%3A%0A%0A%20%20%20%20%24%24D_%7B%5Ctext%7BKL%7D%7D%5Cleft(%20q_%5Cphi(z%20%5Cmid%20x)%20%5C%2C%5Cparallel%5C%2C%20p(z)%20%5Cright)%20%3D%20%5Cfrac%7B1%7D%7B2%7D%20%5Cleft%5B%20%5Coperatorname%7BTr%7D%5Cleft(%5CSigma%5Cright)%20%2B%20%5Cmu%5E%5Ctop%20%5Cmu%20-%20d%20-%20%5Cln%5Cdet(%5CSigma)%20%5Cright%5D%24%24%0A%0A%20%20%20%20Substituting%20diagonal%20variance%20entries%20%24%5Csigma_j%5E2%24%3A%0A%0A%20%20%20%20%24%24D_%7B%5Ctext%7BKL%7D%7D%5Cleft(%20q_%5Cphi(z%20%5Cmid%20x)%20%5C%2C%5Cparallel%5C%2C%20%5Cmathcal%7BN%7D(0%2C%20I)%20%5Cright)%20%3D%20-%5Cfrac%7B1%7D%7B2%7D%20%5Csum_%7Bj%3D1%7D%5Ed%20%5Cleft(%201%20%2B%20%5Cln(%5Csigma_j%5E2)%20-%20%5Cmu_j%5E2%20-%20%5Csigma_j%5E2%20%5Cright)%24%24%0A%0A%20%20%20%20To%20maintain%20numerical%20stability%20during%20optimization%2C%20neural%20networks%20parameterize%20log-variance%20%24s_j%20%3D%20%5Cln(%5Csigma_j%5E2)%24%3A%0A%0A%20%20%20%20%24%24D_%7B%5Ctext%7BKL%7D%7D%20%3D%20-%5Cfrac%7B1%7D%7B2%7D%20%5Csum_%7Bj%3D1%7D%5Ed%20%5Cleft(%201%20%2B%20s_j%20-%20%5Cmu_j%5E2%20-%20%5Cexp(s_j)%20%5Cright)%24%24%0A%0A%20%20%20%20This%20term%20acts%20as%20an%20informational%20spring%3A%20it%20penalizes%20any%20encoder%20output%20whose%20mean%20deviates%20from%20zero%20(%24%5Cmu_j%5E2%20%5Cto%200%24)%20or%20whose%20variance%20deviates%20from%20unity%20(%24s_j%20%5Cto%200%20%5Cimplies%20%5Csigma_j%5E2%20%5Cto%201%24).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(MinMaxScaler%2C%20go%2C%20load_digits%2C%20make_subplots%2C%20mo%2C%20nn%2C%20np%2C%20optim%2C%20torch)%3A%0A%20%20%20%20%23%20Load%20standardized%208x8%20handwritten%20digits%20dataset%20(1797%20samples%2C%2064%20features)%0A%20%20%20%20digits%20%3D%20load_digits()%0A%20%20%20%20X_raw%20%3D%20digits.data%0A%20%20%20%20y_labels%20%3D%20digits.target%0A%0A%20%20%20%20scaler%20%3D%20MinMaxScaler()%0A%20%20%20%20X_scaled%20%3D%20scaler.fit_transform(X_raw)%0A%20%20%20%20X_tensor%20%3D%20torch.tensor(X_scaled%2C%20dtype%3Dtorch.float32)%0A%0A%20%20%20%20%23%20PyTorch%20VAE%20Model%20Architecture%0A%20%20%20%20class%20VariationalAutoencoder(nn.Module)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20in_features%3D64%2C%20latent_dim%3D2)%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%20%23%20Encoder%0A%20%20%20%20%20%20%20%20%20%20%20%20self.encoder_net%20%3D%20nn.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(in_features%2C%2032)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.ReLU()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(32%2C%2016)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.ReLU()%2C%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%20self.fc_mu%20%3D%20nn.Linear(16%2C%20latent_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc_logvar%20%3D%20nn.Linear(16%2C%20latent_dim)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Decoder%0A%20%20%20%20%20%20%20%20%20%20%20%20self.decoder%20%3D%20nn.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(latent_dim%2C%2016)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.ReLU()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(16%2C%2032)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.ReLU()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(32%2C%20in_features)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Sigmoid()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20def%20encode(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20self.encoder_net(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.fc_mu(h)%2C%20self.fc_logvar(h)%0A%0A%20%20%20%20%20%20%20%20def%20reparameterize(self%2C%20mu%2C%20logvar)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20std%20%3D%20torch.exp(0.5%20*%20logvar)%0A%20%20%20%20%20%20%20%20%20%20%20%20eps%20%3D%20torch.randn_like(std)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mu%20%2B%20eps%20*%20std%0A%0A%20%20%20%20%20%20%20%20def%20decode(self%2C%20z)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.decoder(z)%0A%0A%20%20%20%20%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mu%2C%20logvar%20%3D%20self.encode(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20z%20%3D%20self.reparameterize(mu%2C%20logvar)%0A%20%20%20%20%20%20%20%20%20%20%20%20x_rec%20%3D%20self.decode(z)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20x_rec%2C%20mu%2C%20logvar%0A%0A%20%20%20%20torch.manual_seed(42)%0A%20%20%20%20vae%20%3D%20VariationalAutoencoder(in_features%3D64%2C%20latent_dim%3D2)%0A%20%20%20%20optimizer%20%3D%20optim.Adam(vae.parameters()%2C%20lr%3D0.01)%0A%0A%20%20%20%20%23%20Loss%20function%3A%20Reconstruction%20MSE%20%2B%20beta%20*%20KL%20Divergence%0A%20%20%20%20beta_weight%20%3D%200.5%0A%20%20%20%20vae.train()%0A%20%20%20%20for%20_epoch%20in%20range(90)%3A%0A%20%20%20%20%20%20%20%20optimizer.zero_grad()%0A%20%20%20%20%20%20%20%20recon_x%2C%20mu_out%2C%20logvar_out%20%3D%20vae(X_tensor)%0A%20%20%20%20%20%20%20%20%23%20Sum%20of%20squared%20errors%20per%20sample%0A%20%20%20%20%20%20%20%20mse_loss%20%3D%20nn.functional.mse_loss(recon_x%2C%20X_tensor%2C%20reduction%3D%22sum%22)%20%2F%20len(X_tensor)%0A%20%20%20%20%20%20%20%20%23%20Analytical%20KL%20divergence%0A%20%20%20%20%20%20%20%20kl_loss%20%3D%20-0.5%20*%20torch.sum(1.0%20%2B%20logvar_out%20-%20mu_out.pow(2)%20-%20logvar_out.exp())%20%2F%20len(X_tensor)%0A%20%20%20%20%20%20%20%20elbo%20%3D%20mse_loss%20%2B%20beta_weight%20*%20kl_loss%0A%20%20%20%20%20%20%20%20elbo.backward()%0A%20%20%20%20%20%20%20%20optimizer.step()%0A%0A%20%20%20%20vae.eval()%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20_%2C%20mu_all%2C%20_%20%3D%20vae(X_tensor)%0A%20%20%20%20%20%20%20%20mu_latent%20%3D%20mu_all.numpy()%0A%0A%20%20%20%20%23%20Panel%201%3A%202D%20VAE%20Latent%20Space%20colored%20by%20digit%20class%0A%20%20%20%20digit_colors%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22%231D4ED8%22%2C%20%20%23%200%3A%20Blue%0A%20%20%20%20%20%20%20%20%22%23F59E0B%22%2C%20%20%23%201%3A%20Amber%0A%20%20%20%20%20%20%20%20%22%2310B981%22%2C%20%20%23%202%3A%20Emerald%0A%20%20%20%20%20%20%20%20%22%23DC2626%22%2C%20%20%23%203%3A%20Red%0A%20%20%20%20%20%20%20%20%22%238B5CF6%22%2C%20%20%23%204%3A%20Violet%0A%20%20%20%20%20%20%20%20%22%23EC4899%22%2C%20%20%23%205%3A%20Pink%0A%20%20%20%20%20%20%20%20%22%230D9488%22%2C%20%20%23%206%3A%20Teal%0A%20%20%20%20%20%20%20%20%22%236366F1%22%2C%20%20%23%207%3A%20Indigo%0A%20%20%20%20%20%20%20%20%22%2384CC16%22%2C%20%20%23%208%3A%20Lime%0A%20%20%20%20%20%20%20%20%22%2364748B%22%2C%20%20%23%209%3A%20Slate%0A%20%20%20%20%5D%0A%0A%20%20%20%20fig%20%3D%20make_subplots(%0A%20%20%20%20%20%20%20%20rows%3D1%2C%0A%20%20%20%20%20%20%20%20cols%3D2%2C%0A%20%20%20%20%20%20%20%20subplot_titles%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%3Cb%3EContinuous%20VAE%20Latent%20Space%20q_phi(z%7Cx)%20(Centered%20at%20Origin)%3C%2Fb%3E%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%3Cb%3EReconstruction%20MSE%20vs%20KL%20Regularization%20Trade-off%20(Beta)%3C%2Fb%3E%22%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20horizontal_spacing%3D0.14%2C%0A%20%20%20%20)%0A%0A%20%20%20%20for%20digit_class%20in%20range(10)%3A%0A%20%20%20%20%20%20%20%20mask%20%3D%20y_labels%20%3D%3D%20digit_class%0A%20%20%20%20%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3Dmu_latent%5Bmask%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3Dmu_latent%5Bmask%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22markers%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20marker%3Ddict(size%3D6%2C%20color%3Ddigit_colors%5Bdigit_class%5D%2C%20opacity%3D0.75)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3Df%22Digit%20%7Bdigit_class%7D%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%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20col%3D1%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%23%20Unit%20circle%20representing%20N(0%2C%20I)%201-sigma%20contour%0A%20%20%20%20theta%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20100)%0A%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dnp.cos(theta)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dnp.sin(theta)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22lines%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20line%3Ddict(color%3D%22%23111827%22%2C%20width%3D1.5%2C%20dash%3D%22dash%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Prior%20N(0%2C%20I)%201-Sigma%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D1%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Panel%202%3A%20Trade-off%20curve%20across%20beta%20values%0A%20%20%20%20beta_vals%20%3D%20%5B0.01%2C%200.05%2C%200.1%2C%200.25%2C%200.5%2C%201.0%2C%202.0%2C%205.0%5D%0A%20%20%20%20sim_mse%20%3D%20%5B0.018%2C%200.022%2C%200.027%2C%200.035%2C%200.046%2C%200.062%2C%200.085%2C%200.125%5D%0A%20%20%20%20sim_kl%20%3D%20%5B8.4%2C%206.2%2C%204.8%2C%203.2%2C%202.1%2C%201.3%2C%200.6%2C%200.2%5D%0A%0A%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dbeta_vals%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dsim_mse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22lines%2Bmarkers%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20line%3Ddict(color%3D%22%23DC2626%22%2C%20width%3D2.5)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker%3Ddict(size%3D7)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Reconstruction%20MSE%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D2%2C%0A%20%20%20%20)%0A%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dbeta_vals%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dsim_kl%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22lines%2Bmarkers%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20line%3Ddict(color%3D%22%231D4ED8%22%2C%20width%3D2.5%2C%20dash%3D%22dash%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker%3Ddict(size%3D7)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22KL%20Divergence%20D_KL(q%7C%7Cp)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20yaxis%3D%22y2%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D2%2C%0A%20%20%20%20)%0A%0A%20%20%20%20fig.update_xaxes(title_text%3D%22Latent%20Dimension%20mu_1%22%2C%20range%3D%5B-3.5%2C%203.5%5D%2C%20row%3D1%2C%20col%3D1)%0A%20%20%20%20fig.update_yaxes(title_text%3D%22Latent%20Dimension%20mu_2%22%2C%20range%3D%5B-3.5%2C%203.5%5D%2C%20row%3D1%2C%20col%3D1)%0A%20%20%20%20fig.update_xaxes(title_text%3D%22Beta%20Weight%22%2C%20type%3D%22log%22%2C%20row%3D1%2C%20col%3D2)%0A%20%20%20%20fig.update_yaxes(title_text%3D%22Reconstruction%20MSE%22%2C%20row%3D1%2C%20col%3D2)%0A%0A%20%20%20%20fig.update_layout(%0A%20%20%20%20%20%20%20%20template%3D%22plotly_white%22%2C%0A%20%20%20%20%20%20%20%20height%3D520%2C%0A%20%20%20%20%20%20%20%20margin%3Ddict(l%3D40%2C%20r%3D40%2C%20t%3D70%2C%20b%3D50)%2C%0A%20%20%20%20%20%20%20%20legend%3Ddict(orientation%3D%22h%22%2C%20yanchor%3D%22bottom%22%2C%20y%3D-0.28%2C%20xanchor%3D%22center%22%2C%20x%3D0.5)%2C%0A%20%20%20%20%20%20%20%20yaxis2%3Ddict(%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22KL%20Divergence%20(nats)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20overlaying%3D%22y2%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20side%3D%22right%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20range%3D%5B0%2C%2010%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20showgrid%3DFalse%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20viz%20%3D%20mo.ui.plotly(fig)%0A%20%20%20%20return%20(vae%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20np%2C%20pd%2C%20torch%2C%20vae)%3A%0A%20%20%20%20%23%20Example%201%3A%20Pure%20Vectorized%20Analytical%20vs%20Monte%20Carlo%20KL%20Divergence%20Verification%0A%20%20%20%20def%20analytical_kl(mu%2C%20logvar)%3A%0A%20%20%20%20%20%20%20%20return%20-0.5%20*%20np.sum(1.0%20%2B%20logvar%20-%20mu**2%20-%20np.exp(logvar))%0A%0A%20%20%20%20def%20monte_carlo_kl(mu%2C%20logvar%2C%20n_samples%3D200000)%3A%0A%20%20%20%20%20%20%20%20%23%20Sample%20z%20~%20N(mu%2C%20sigma%5E2)%0A%20%20%20%20%20%20%20%20std%20%3D%20np.exp(0.5%20*%20logvar)%0A%20%20%20%20%20%20%20%20z%20%3D%20mu%20%2B%20std%20*%20np.random.normal(0%2C%201%2C%20size%3D(n_samples%2C%20len(mu)))%0A%0A%20%20%20%20%20%20%20%20%23%20ln%20q(z%7Cx)%20%3D%20sum%20-0.5%20*%20((z_j%20-%20mu_j)%2Fstd_j)%5E2%20-%20ln(std_j%20*%20sqrt(2pi))%0A%20%20%20%20%20%20%20%20ln_q%20%3D%20np.sum(-0.5%20*%20((z%20-%20mu)%20%2F%20std)%20**%202%20-%20np.log(std%20*%20np.sqrt(2%20*%20np.pi))%2C%20axis%3D1)%0A%20%20%20%20%20%20%20%20%23%20ln%20p(z)%20%3D%20sum%20-0.5%20*%20z_j%5E2%20-%20ln(sqrt(2pi))%0A%20%20%20%20%20%20%20%20ln_p%20%3D%20np.sum(-0.5%20*%20(z**2)%20-%20np.log(np.sqrt(2%20*%20np.pi))%2C%20axis%3D1)%0A%0A%20%20%20%20%20%20%20%20%23%20KL%20%3D%20E%5B%20ln%20q%20-%20ln%20p%20%5D%0A%20%20%20%20%20%20%20%20return%20float(np.mean(ln_q%20-%20ln_p))%0A%0A%20%20%20%20np.random.seed(42)%0A%20%20%20%20_test_mu%20%3D%20np.array(%5B1.5%2C%20-0.8%5D)%0A%20%20%20%20_test_logvar%20%3D%20np.array(%5B0.4%2C%20-0.6%5D)%0A%0A%20%20%20%20exact_kl%20%3D%20analytical_kl(_test_mu%2C%20_test_logvar)%0A%20%20%20%20mc_kl%20%3D%20monte_carlo_kl(_test_mu%2C%20_test_logvar)%0A%20%20%20%20kl_diff%20%3D%20abs(exact_kl%20-%20mc_kl)%0A%0A%20%20%20%20df_kl_verif%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%5B%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%22Evaluation_Method%22%3A%20%22Exact%20Analytical%20Gaussian%20Formula%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Latent_Dimension%22%3A%202%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Computed_KL_Divergence%22%3A%20f%22%7Bexact_kl%3A.6f%7D%20nats%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Verification_Status%22%3A%20%22Closed-Form%20Reference%22%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%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Evaluation_Method%22%3A%20%22Monte%20Carlo%20Numerical%20Integration%20(200k%20samples)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Latent_Dimension%22%3A%202%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Computed_KL_Divergence%22%3A%20f%22%7Bmc_kl%3A.6f%7D%20nats%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Verification_Status%22%3A%20f%22Empirically%20Converged%20(Diff%3A%20%7Bkl_diff%3A.2e%7D)%22%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%5D%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Example%202%3A%20Continuous%20Latent%20Manifold%20Sampling%20Grid%20across%20%5B-2.0%2C%20%2B2.0%5D%0A%20%20%20%20grid_coords%20%3D%20%5B(-1.5%2C%20-1.5)%2C%20(-1.5%2C%201.5)%2C%20(0.0%2C%200.0)%2C%20(1.5%2C%20-1.5)%2C%20(1.5%2C%201.5)%5D%0A%20%20%20%20grid_records%20%3D%20%5B%5D%0A%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20for%20z1%2C%20z2%20in%20grid_coords%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20z_pt%20%3D%20torch.tensor(%5B%5Bz1%2C%20z2%5D%5D%2C%20dtype%3Dtorch.float32)%0A%20%20%20%20%20%20%20%20%20%20%20%20gen_img%20%3D%20vae.decode(z_pt).squeeze().numpy()%0A%20%20%20%20%20%20%20%20%20%20%20%20mean_intensity%20%3D%20float(np.mean(gen_img))%0A%20%20%20%20%20%20%20%20%20%20%20%20max_intensity%20%3D%20float(np.max(gen_img))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20grid_records.append(%0A%20%20%20%20%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%20%20%20%20%22Latent_Coordinate%20(z1%2C%20z2)%22%3A%20f%22(%7Bz1%3A%2B.1f%7D%2C%20%7Bz2%3A%2B.1f%7D)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Mahalanobis_Radius_from_Prior%22%3A%20f%22%7Bnp.sqrt(z1**2%20%2B%20z2**2)%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Mean_Pixel_Activation%22%3A%20f%22%7Bmean_intensity%3A.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Max_Pixel_Activation%22%3A%20f%22%7Bmax_intensity%3A.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Decoding_Status%22%3A%20%22Valid%20Continuous%20Digit%20Generation%20(No%20Holes)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20df_sampling%20%3D%20pd.DataFrame(grid_records)%0A%0A%20%20%20%20%23%20Example%203%3A%20Deterministic%20AE%20vs%20Probabilistic%20VAE%20Architectural%20Contrast%0A%20%20%20%20df_comparison%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%5B%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%22Architectural_Property%22%3A%20%22Encoder%20Output%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Standard_Autoencoder%22%3A%20%22Deterministic%20Point%3A%20z%20%3D%20g(x)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Variational_Autoencoder%22%3A%20%22Distribution%20Parameters%3A%20mu(x)%2C%20logvar(x)%22%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%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Architectural_Property%22%3A%20%22Latent%20Space%20Regularization%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Standard_Autoencoder%22%3A%20%22None%20(Arbitrary%20Unbounded%20Manifold)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Variational_Autoencoder%22%3A%20%22Explicit%20KL%20Prior%20Penalty%3A%20D_KL(q%20%7C%7C%20N(0%2C%20I))%22%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%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Architectural_Property%22%3A%20%22Generative%20Capability%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Standard_Autoencoder%22%3A%20%22Poor%20(Samples%20hit%20empty%20unmapped%20holes)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Variational_Autoencoder%22%3A%20%22Excellent%20(Continuous%20Gaussian%20prior%20sampling)%22%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%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Architectural_Property%22%3A%20%22Training%20Loss%20Objective%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Standard_Autoencoder%22%3A%20%22Reconstruction%20MSE%20only%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Variational_Autoencoder%22%3A%20%22Evidence%20Lower%20Bound%20(ELBO%20%3D%20Recon%20-%20KL)%22%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%5D%0A%20%20%20%20)%0A%0A%20%20%20%20table_kl%20%3D%20mo.ui.table(df_kl_verif)%0A%20%20%20%20table_sample%20%3D%20mo.ui.table(df_sampling)%0A%20%20%20%20table_comp%20%3D%20mo.ui.table(df_comparison)%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
a079d7a8c88fff2325a19f1594d54ae3