File size: 3,137 Bytes
11a95b4
 
 
 
 
 
 
 
9f47792
11a95b4
 
 
 
 
 
 
 
 
 
9f47792
11a95b4
9f47792
 
11a95b4
9f47792
 
 
ba335a6
 
 
 
 
9f47792
ba335a6
 
 
 
9f47792
 
 
 
 
 
 
ba335a6
9f47792
 
 
11a95b4
9f47792
 
 
 
 
11a95b4
9f47792
 
 
 
 
 
 
 
11a95b4
9f47792
 
 
11a95b4
 
 
9f47792
11a95b4
 
ba335a6
 
 
 
 
11a95b4
9f47792
11a95b4
9f47792
ba335a6
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
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.

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 fig


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_result = gr.Plot()
    run_button.click(fn=curve_fit, inputs=[size, alpha, lam], outputs=[plot_result])

demo.launch()