File size: 3,656 Bytes
11a95b4 9f47792 11a95b4 9f47792 11a95b4 8780bfc 9f47792 11a95b4 9f47792 ba335a6 9f47792 ba335a6 9f47792 ba335a6 9f47792 11a95b4 9f47792 11a95b4 9f47792 11a95b4 9f47792 8780bfc 9f47792 11a95b4 9f47792 11a95b4 ba335a6 11a95b4 9f47792 11a95b4 8780bfc 11a95b4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
import matplotlib.cm as cm
from sklearn.utils import shuffle
from sklearn.utils import check_random_state
from sklearn.linear_model import BayesianRidge
theme = gr.themes.Monochrome(
primary_hue="indigo",
secondary_hue="blue",
neutral_hue="slate",
)
description = f"""
## Description
This demo computes a Bayesian Ridge Regression of Sinusoids.
In general, when fitting a curve with a polynomial by Bayesian ridge regression, the selection of initial values of the regularization parameters (alpha, lambda) may be important. This is because the regularization parameters are determined by an iterative procedure that depends on initial values.
In this demo, the sinusoid is approximated by a cubic polynomial using different pairs of initial values.
The demo is based on the [scikit-learn docs](https://scikit-learn.org/stable/auto_examples/linear_model/plot_bayesian_ridge_curvefit.html#sphx-glr-auto-examples-linear-model-plot-bayesian-ridge-curvefit-py)
"""
def func(x):
return np.sin(2 * np.pi * x)
def curve_fit(size, alpha, lam):
rng = np.random.RandomState(1234)
x_train = rng.uniform(0.0, 1.0, size)
y_train = func(x_train) + rng.normal(scale=0.1, size=size)
x_test = np.linspace(0.0, 1.0, 100)
n_order = 3
X_train = np.vander(x_train, n_order + 1, increasing=True)
X_test = np.vander(x_test, n_order + 1, increasing=True)
reg = BayesianRidge(tol=1e-6, fit_intercept=False, compute_score=True)
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
for i, ax in enumerate(axes):
# Bayesian ridge regression with different initial value pairs
if i == 0:
init = [1 / np.var(y_train), 1.0] # Default values
elif i == 1:
init = [alpha, lam]
reg.set_params(alpha_init=init[0], lambda_init=init[1])
reg.fit(X_train, y_train)
ymean, ystd = reg.predict(X_test, return_std=True)
ax.plot(x_test, func(x_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="predict mean")
ax.fill_between(
x_test, ymean - ystd, ymean + ystd, color="pink", alpha=0.5, label="predict std"
)
ax.set_ylim(-1.3, 1.3)
ax.legend()
title = "$\\alpha$_init$={:.2f},\\ \\lambda$_init$={}$".format(init[0], init[1])
if i == 0:
title += " (Default)"
ax.set_title(title, fontsize=12)
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 axes[0], axes[1]
with gr.Blocks(theme=theme) as demo:
gr.Markdown('''
<h1 style='text-align: center'>Curve Fitting with Bayesian Ridge Regression π</h1>
''')
gr.Markdown(description)
with gr.Row():
size = gr.Slider(minimum=10, maximum=100, step=5, value=25, label="Number of Data Points")
alpha = gr.Slider(minimum=1e-2, maximum=2, step=0.1, value=1, label="Initial Alpha")
lam = gr.Slider(minimum=1e-5, maximum=1, step=1e-4, value=1e-3, label="Initial Lambda")
with gr.Row():
run_button = gr.Button('Fit the Curve')
with gr.Row():
plot_default = gr.Plot('Default Initialization')
plot_chosen = gr.Plot('Chosen Initialization')
run_button.click(fn=curve_fit, inputs=[size, alpha, lam], outputs=[plot_default, plot_chosen])
demo.launch() |