使用贝叶斯岭回归进行曲线拟合#

计算正弦曲线的贝叶斯岭回归。

有关回归器的更多信息,请参阅贝叶斯岭回归

通常,当使用贝叶斯岭回归用多项式拟合曲线时,正则化参数(alpha、lambda)初始值的选择可能很重要。这是因为正则化参数是由依赖于初始值的迭代过程确定的。

在本例中,使用不同的初始值对,用多项式逼近正弦曲线。

当从默认值(alpha_init = 1.90,lambda_init = 1.)开始时,所得曲线的偏差较大,方差较小。因此,lambda_init 应该相对较小(1.e-3),以便减少偏差。

此外,通过评估这些模型的对数边际似然 (L),我们可以确定哪个模型更好。可以得出结论,L 越大的模型可能性越大。

# Author: Yoshihiro Uchida <[email protected]>

生成带噪声的正弦数据#

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)

绘制真实曲线和预测曲线以及对数边际似然 (L)#

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()
$\alpha$_init$=1.90,\ \lambda$_init$=1.0$ (Default), $\alpha$_init$=1.00,\ \lambda$_init$=0.001$

脚本总运行时间:(0 分钟 0.378 秒)

相关示例

比较线性贝叶斯回归器

比较线性贝叶斯回归器

使用 KBinsDiscretizer 对连续特征进行离散化

使用 KBinsDiscretizer 对连续特征进行离散化

梯度提升回归

梯度提升回归

k 均值初始化影响的实证评估

k 均值初始化影响的实证评估

由 Sphinx-Gallery 生成的图库