Ajuste de curvas con regresión de Ridge bayesiana

Beginner

This tutorial is from open-source community. Access the source code

Introducción

Esta práctica demuestra cómo utilizar la regresión de Ridge bayesiana para ajustar una curva polinómica a datos sinusoidales. Generaremos datos sinusoidales con ruido, los ajustaremos utilizando un polinomio cúbico y graficaremos las curvas reales y predichas con la verosimilitud marginal logarítmica (L) de estos modelos, para determinar cuál es mejor.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Generar datos sinusoidales con ruido

Comenzamos generando datos sinusoidales con ruido.

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)

Ajuste con polinomio cúbico

Ajustamos los datos utilizando un polinomio cúbico.

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)

Graficar las curvas reales y predichas con verosimilitud marginal logarítmica (L)

Graficamos las curvas reales y predichas con la verosimilitud marginal logarítmica (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]  ## Valores predeterminados
    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="observación")
    ax.plot(x_test, ymean, color="red", label="predicción media")
    ax.fill_between(
        x_test, ymean - ystd, ymean + ystd, color="pink", alpha=0.5, label="predicción std"
    )
    ax.set_ylim(-1.3, 1.3)
    ax.legend()
    título = "$\\alpha$_init$={:.2f},\\ \\lambda$_init$={}$".format(init[0], init[1])
    if i == 0:
        título += " (Predeterminado)"
    ax.set_title(título, fontsize=12)
    texto = "$\\alpha={:.1f}$\n$\\lambda={:.3f}$\n$L={:.1f}$".format(
        reg.alpha_, reg.lambda_, reg.scores_[-1]
    )
    ax.text(0.05, -1.0, texto, fontsize=12)

plt.tight_layout()
plt.show()

Resumen

La regresión de Ridge bayesiana es una técnica poderosa para el ajuste de curvas que se puede utilizar para ajustar datos a una curva polinómica. Al iterar sobre diferentes valores iniciales para los parámetros de regularización, podemos encontrar el mejor ajuste para los datos dados.