赞
踩
p ( w ∣ λ ) = N ( w ∣ 0 , λ − 1 I p ) p(w|\lambda)=N(w|0,\lambda^{-1}I_p) p(w∣λ)=N(w∣0,λ−1Ip)
而 α \alpha α和 γ \gamma γ的先验分布是伽马分别,和 y i y_i yi的共轭先验是正态分布,所以其结果就是贝叶斯岭回归模型。
其中正则化系数
α
\alpha
α和
γ
\gamma
γ由极大似然法估计。相比普通最小二乘法,贝叶斯岭回归更适合于表现比较差的数据。在sklearn中一般表示为alpha_init
和lambda_init
。
一般情况下,lambda_init
相对小(1.e-3/0.001)。
代码实现:
import numpy as np
def func(x):
return np.sin(2 * np.pi * x)
size = 25
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)
from sklearn.linear_model import BayesianRidge
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)
import matplotlib.pyplot as plt 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 = [1.0, 1e-3] 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) plt.tight_layout() plt.show()
结果为:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。