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
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)
Out[4]:
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]:
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),
)
Out[8]:
In [ ]:
In [ ]:
In [ ]: