Аппроксимация кривой с использованием байесовской гребневой регрессии#

Вычисляет байесовскую гребневую регрессию синусоид.

См. Байесовская гребневая регрессия Первые три столбца показывают прогнозируемую вероятность для различных значений двух признаков. Круглые маркеры представляют тестовые данные, которые были предсказаны как принадлежащие этому классу.

В общем случае, при подгонке кривой полиномом с помощью байесовской гребневой регрессии, выбор начальных значений параметров регуляризации (alpha, lambda) может быть важен. Это связано с тем, что параметры регуляризации определяются итерационной процедурой, зависящей от начальных значений.

В этом примере синусоида аппроксимируется полиномом с использованием разных пар начальных значений.

При начальных значениях по умолчанию (alpha_init = 1.90, lambda_init = 1.) смещение результирующей кривой велико, а дисперсия мала. Поэтому lambda_init должен быть относительно малым (1.e-3), чтобы уменьшить смещение.

Кроме того, оценивая логарифм маргинального правдоподобия (L) этих моделей, мы можем определить, какая из них лучше. Можно заключить, что модель с большим L более вероятна.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Генерация синусоидальных данных с шумом#

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.297 секунд)

Связанные примеры

Сравнение линейных байесовских регрессоров

Сравнение линейных байесовских регрессоров

Использование KBinsDiscretizer для дискретизации непрерывных признаков

Использование KBinsDiscretizer для дискретизации непрерывных признаков

Эмпирическая оценка влияния инициализации k-means

Эмпирическая оценка влияния инициализации k-means

Градиентный бустинг для регрессии

Градиентный бустинг для регрессии

Галерея, созданная Sphinx-Gallery