In [1]:
import bayescraft.stats as bstats
import bayescraft as b
import numpy as np
import scipy as sp
import scipy.stats as stats
import matplotlib as mpl
import matplotlib.pyplot as plt
import bokeh as bo
import bokeh.plotting as bplt
import bokeh.models as bmod
from sklearn.linear_model import BayesianRidge
from IPython.html.widgets import interact
import IPython.html.widgets as widgets
bplt.output_notebook()
%matplotlib inline


:0: FutureWarning: IPython widgets are experimental and may change in the future.
BokehJS successfully loaded.

In [2]:
def generate_data(n, dim=1, x_range=(0, 10), coef_range=(1, 10), noise_var=1):
    global tick
    X, y = [], []

    coef_mid = (coef_range[0] + coef_range[1]) / 2.
    coef_range = coef_range[1] - coef_range[0]
    x_mid = (x_range[0] + x_range[1]) / 2.
    x_range = x_range[1] - x_range[0]

    coef = (np.random.rand(dim) - 0.5)*coef_range + coef_mid
    for i in range(n):
        X.append((np.random.rand(dim) - 0.5)*x_range + x_mid)
        y.append(np.dot(X[-1], coef) + np.random.randn(dim)*np.sqrt(noise_var))
    X = np.array(X)
    y = np.ravel(np.array(y))
    return X, y, coef

In [3]:
n = 10
x0 = 0
x1 = 10
c0 = -10
c1 = 10
dim = 1

In [4]:
X, y, coef = generate_data(n=n, dim=1, noise_var=100, x_range=(x0, x1), coef_range=(c0, c1))
X1 = np.hstack([X, np.ones((X.shape[0], 1))])
offset = np.random.rand() * 50 - 25
y += offset
coef = np.hstack([coef, [offset]])
print(coef[0])
t = np.linspace(x0, x1, 100)
f = coef[0]*t + coef[1]
plt.plot(t, f)
plt.scatter(X[:, 0], y, alpha=0.5)
plt.hlines(0, xmin=0, xmax=10)
plt.vlines(0, ymin=-100, ymax=100)


-9.67089715718
Out[4]:
<matplotlib.collections.LineCollection at 0x7f5591564a58>

In [5]:
source = bmod.ColumnDataSource(data=dict(t=t, 
                                         x=X[:,0], 
                                         y=y, 
                                         sklearn_f=y, 
                                         bayescraft_f=y, 
                                         bayescraft_online_f=y, 
                                         truth=np.array(list(map(lambda x: coef[0]*x + coef[1], t)))))
p = bplt.figure(title='Bayesian linear regression', plot_height=300, plot_width=800)
p.line('t', 'sklearn_f', color="#FFAA00", line_width=1.5, source=source, name="sklearn")
p.line('t', 'truth', color="#00AA00", line_width=5, source=source, name="truth", alpha=0.5)
p.line('t', 'bayescraft_f', color="#0000FF", line_width=1.5, source=source, name="bayescraft_f")
p.line('t', 'bayescraft_online_f', color="#00FFFF", line_width=3, alpha=0.5, source=source, name="bayescraft_online_f")
p.scatter('x', 'y', source=source, name='data_points', size=10, alpha=0.5)


Out[5]:
<bokeh.plotting.Figure at 0x7f55915977f0>

In [6]:
bplt.show(p)



In [7]:
def update(log_alpha_1=1e-6, log_alpha_2=1e-6, log_lambda_1=1e-6, log_lambda_2=1e-6, log_g=1):
    t = source.data['t']
    g = np.exp(log_g)
    alpha_1 = np.exp(log_alpha_1)
    alpha_2 = np.exp(log_alpha_2)
    lambda_1 = np.exp(log_lambda_1)
    lambda_2 = np.exp(log_lambda_2)
    
    sklearn_regression = BayesianRidge(alpha_1=alpha_1, alpha_2=alpha_2, lambda_1=lambda_1, lambda_2=lambda_2)
    sklearn_regression.fit(X, y)
    source.data['sklearn_f'] = np.array(list(map(lambda x: sklearn_regression.predict(x), t)))
    
    bayescraft_regression = b.g_prior(X1, g=g)
    bayescraft_regression.fit(X1, y)
    source.data['bayescraft_f'] = np.array(list(map(lambda x: bayescraft_regression.predict([[x, 1]])._mean, t)))
    
    bayescraft_online_regression = b.g_prior(X1, g=g)
    for cur_x, cur_y in list(zip(X1, y)):
        bayescraft_online_regression.update(cur_x, cur_y)
    print(bayescraft_online_regression.w.mean, bayescraft_regression.w.mean, sep='\n')
    source.data['bayescraft_online_f'] = np.array(list(map(lambda x: bayescraft_online_regression.predict([[x, 1]])._mean, t)))
    source.push_notebook()

In [8]:
interact(update, 
         log_alpha_1=widgets.FloatSliderWidget(min=-15,max=15,value=-15,step=0.05),
         log_alpha_2=widgets.FloatSliderWidget(min=-15,max=15,value=-15,step=0.05),
         log_lambda_1=widgets.FloatSliderWidget(min=-15,max=15,value=-15,step=0.05),
         log_lambda_2=widgets.FloatSliderWidget(min=-15,max=15,value=-15,step=0.05),
         log_g=widgets.FloatSliderWidget(min=-15,max=15,value=15,step=0.05),
        )


[[-10.17281395]
 [ -8.72114613]]
[[-10.40831432]
 [ -9.26948471]]
Out[8]:
<function __main__.update>

In [ ]:


In [ ]:


In [ ]: