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.