Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
| import gradio as gr | |
| import matplotlib.pyplot as plt | |
| import numpy as np | |
| from sklearn.linear_model import BayesianRidge | |
| SEED = 1234 | |
| ORDER = 3 | |
| MAX_SAMPLES = 100 | |
| def sin_wave(x: np.array): | |
| """Sinusoidal wave function""" | |
| return np.sin(2 * np.pi * x) | |
| def generate_train_data(n_samples: int): | |
| """Generates sinuosidal data with noise""" | |
| rng = np.random.RandomState(SEED) | |
| x_train = rng.uniform(0.0, 1.0, n_samples) | |
| y_train = sin_wave(x_train) + rng.normal(scale=0.1, size=n_samples) | |
| X_train = np.vander(x_train, ORDER + 1, increasing=True) | |
| return x_train, X_train, y_train | |
| def get_app_fn(): | |
| """Returns the demo function with pre-generated data and model""" | |
| x_test = np.linspace(0.0, 1.0, 100) | |
| X_test = np.vander(x_test, ORDER + 1, increasing=True) | |
| y_test = sin_wave(x_test) | |
| reg = BayesianRidge(tol=1e-6, fit_intercept=False, compute_score=True) | |
| x_train_full, X_train_full, y_train_full = generate_train_data(MAX_SAMPLES) | |
| def app_fn(n_samples: int, alpha_init: float, lambda_init: float): | |
| """Train a Bayesian Ridge regression model and plot the predicted points""" | |
| rng = np.random.RandomState(SEED) | |
| subset_idx = rng.randint(0, MAX_SAMPLES, n_samples) | |
| x_train, X_train, y_train = ( | |
| x_train_full[subset_idx], | |
| X_train_full[subset_idx], | |
| y_train_full[subset_idx], | |
| ) | |
| reg.set_params(alpha_init=alpha_init, lambda_init=lambda_init) | |
| reg.fit(X_train, y_train) | |
| ymean, ystd = reg.predict(X_test, return_std=True) | |
| fig, ax = plt.subplots() | |
| ax.plot(x_test, y_test, color="blue", label="sin($2\\pi x$)") | |
| ax.scatter(x_train, y_train, s=50, alpha=0.5, label="observation") | |
| ax.plot(x_test, ymean, color="red", label="predicted mean") | |
| ax.fill_between( | |
| x_test, | |
| ymean - ystd, | |
| ymean + ystd, | |
| color="pink", | |
| alpha=0.5, | |
| label="predicted std", | |
| ) | |
| ax.set_ylim(-1.3, 1.3) | |
| ax.set_xlabel("Cycles") | |
| ax.set_ylabel("Amplitude") | |
| ax.legend() | |
| text = "$\\alpha={:.1f}$\n$\\lambda={:.3f}$\n$L={:.1f}$".format( | |
| reg.alpha_, reg.lambda_, reg.scores_[-1] | |
| ) | |
| ax.text(0.05, -1.0, text, fontsize=12) | |
| return fig | |
| return app_fn | |
| title = "Bayesian Ridge Regression" | |
| description = ( | |
| "This demo is based on the [Bayesian Ridge Regression](https://scikit-learn.org/stable/auto_examples/linear_model/plot_bayesian_ridge_curvefit.html#curve-fitting-with-bayesian-ridge-regression) " | |
| "example from scikit-learn.\n" | |
| "The example shows the effect of different initial values for the regularisation parameters `alpha` and `lambda`. " | |
| "When starting from the default values (`alpha_init = 1.90`, `lambda_init = 1.`), the bias of the resulting curve is large, " | |
| "and the variance is small. So, `lambda_init` should be relatively small (e.g. `1.e-3`) to reduce the bias.\n" | |
| "By evaluating log marginal likelihood (`L`) of these models, we can determine which one is better. A model with larger `L` is more likely." | |
| ) | |
| with gr.Blocks(title=title) as demo: | |
| gr.Markdown(f"## {title}") | |
| gr.Markdown(description) | |
| n_samples_input = gr.Slider( | |
| minimum=5, maximum=100, value=25, step=1, label="#observations" | |
| ) | |
| alpha_input = gr.Slider( | |
| minimum=0.001, maximum=5, value=1.9, step=0.01, label="alpha_init" | |
| ) | |
| lambda_input = gr.Slider( | |
| minimum=0.001, maximum=5, value=1.0, step=0.01, label="lambda_init" | |
| ) | |
| outputs = gr.Plot(label="Output") | |
| inputs = [n_samples_input, alpha_input, lambda_input] | |
| app_fn = get_app_fn() | |
| n_samples_input.change(fn=app_fn, inputs=inputs, outputs=outputs) | |
| alpha_input.change(fn=app_fn, inputs=inputs, outputs=outputs) | |
| lambda_input.change(fn=app_fn, inputs=inputs, outputs=outputs) | |
| demo.launch() | |