贝叶斯岭回归是一种强大的机器学习技术,它可以用来拟合曲线。在本例中,将使用贝叶斯岭回归来拟合正弦波数据。贝叶斯岭回归通过引入正则化参数来控制模型的复杂度,从而避免过拟合。正则化参数的选择对模型的性能有着显著的影响。在实际操作中,通常需要通过迭代过程来确定这些参数的最优值,而初始值的选择对于迭代过程的结果至关重要。
在本例中,首先生成了一些带有噪声的正弦波数据。然后,使用不同初始值的贝叶斯岭回归模型来拟合这些数据。发现,当使用默认的初始值时,拟合出的曲线偏差较大,方差较小。为了减少偏差,应该选择一个较小的初始lambda值。此外,还可以通过评估模型的对数边际似然(L)来确定哪个模型更好。通常,对数边际似然值较大的模型更有可能是一个好的模型。
以下是生成正弦波数据和噪声的Python代码示例:
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):
# 使用不同的初始值对进行贝叶斯岭回归
if i == 0:
init = [1 / np.var(y_train), 1.0] # 默认值
elif i == 1:
init = [1.0, 1e-3] # 较小的lambda初始值
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="观测值")
ax.plot(x_test, ymean, color="red", label="预测均值")
ax.fill_between(x_test, ymean - ystd, ymean + ystd, color="pink", alpha=0.5, label="预测标准差")
ax.set_ylim(-1.3, 1.3)
ax.legend()
title = "$\\alpha$_init$={:.2f}, $\\lambda$_init$={}$".format(init[0], init[1])
if i == 0:
title += " (默认)"
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()