Skip to content
Statistical RethinkingStatistical Rethinking

13.4 Categorías continuas y el proceso Gaussiano

Los procesos Gaussianos modelan categorías continuas — como ubicaciones espaciales o puntos en el tiempo — como una distribución normal multivariada. Capturan correlaciones que decaen suavemente con la distancia.

13.4.1 El proceso Gaussiano

Un proceso Gaussiano es una distribución sobre funciones. En lugar de modelar cada observación independientemente, el PG las modela conjuntamente como normal multivariada con una función de covarianza:

Cov(f(x),f(x′))=σ2exp⁡(−(x−x′)22ℓ2)\text{Cov}(f(x), f(x')) = \sigma^2 \exp\left(-\frac{(x-x')^2}{2\ell^2}\right)

Este es el kernel exponencial cuadrado. La escala de longitud ℓ\ell controla qué tan rápido decae la correlación con la distancia. La amplitud σ\sigma controla la magnitud de la variación.

# Gaussian process: squared exponential kernel
set.seed(42)

# Generate x values

x <- seq(0, 10, length.out = 50)

# Squared exponential kernel function

se*kernel <- function(x1, x2, sigma = 1, ell = 1) {
sigma^2 * exp(-outer(x1, x2, "-")^2 / (2 _ ell^2))
}

# Compute covariance matrices for different length scales

K_ell1 <- se_kernel(x, x, sigma = 1, ell = 1)
K_ell2 <- se_kernel(x, x, sigma = 1, ell = 2)
K_ell5 <- se_kernel(x, x, sigma = 1, ell = 5)

# Draw samples from the GP prior

library(MASS)
n_samples <- 5

cat("Gaussian process prior samples:\n")
cat(" Length scale controls smoothness:\n")
cat(" ell = 1: wiggly functions\n")
cat(" ell = 2: moderate smoothness\n")
cat(" ell = 5: very smooth functions\n")

# Plot

par(mfrow = c(1, 3))
for (ell_val in c(1, 2, 5)) {
K <- se_kernel(x, x, sigma = 1, ell = ell_val)
samples <- mvrnorm(n_samples, rep(0, length(x)), K)
plot(x, samples[1, ], type = "l", ylim = range(samples),
main = paste("ell =", ell_val), xlab = "x", ylab = "f(x)")
for (s in 2:n_samples) lines(x, samples[s, ], col = s)
}
par(mfrow = c(1, 1))
Click Run to execute this code in your browser with WebR

13.4.2 Ajustando un proceso Gaussiano

# Gaussian process regression: simulate and fit
set.seed(42)

# True function: a smooth curve

x <- seq(0, 10, length.out = 30)
f*true <- 3 * sin(x) + 0.5 _ x
y <- f_true + rnorm(length(x), 0, 0.5)

# GP regression using a simple approach

# Compute the covariance matrix

ell <- 1.5
sigma_f <- 2
sigma_n <- 0.5 # noise

K <- sigma*f^2 * exp(-outer(x, x, "-")^2 / (2 _ ell^2))
K_noise <- K + sigma_n^2 * diag(length(x))

# GP posterior mean at training points

# f_post = K^T (K + sigma_n^2 I)^{-1} y

L <- chol(K_noise)
alpha <- backsolve(L, forwardsolve(t(L), y))
f_post <- K %*% alpha

cat("Gaussian process regression:\n")
cat(" Length scale (ell):", ell, "\n")
cat(" Amplitude (sigma_f):", sigma_f, "\n")
cat(" Noise (sigma_n):", sigma_n, "\n")
cat(" Posterior mean RMSE:", round(sqrt(mean((f_post - f_true)^2)), 3), "\n")

# Predict at new points

x*new <- seq(0, 10, length.out = 100)
K_star <- sigma_f^2 * exp(-outer(x*new, x, "-")^2 / (2 * ell^2))
f_pred <- K_star %*% alpha

# Plot

plot(x, y, pch = 16, col = "steelblue",
main = "Gaussian process regression",
xlab = "x", ylab = "y")
lines(x*new, f_pred, lwd = 2, col = "firebrick")
curve(3 * sin(x) + 0.5 _ x, add = TRUE, lty = 2, col = "darkgreen", lwd = 2)
legend("topleft", legend = c("Data", "GP posterior mean", "True function"),
col = c("steelblue", "firebrick", "darkgreen"),
pch = c(16, NA, NA), lty = c(NA, 1, 2), lwd = c(NA, 2, 2))
Click Run to execute this code in your browser with WebR
Rethinking

Los procesos Gaussianos son interceptos variables para categorías continuas. Un PG es un modelo multinivel donde los "grupos" son puntos a lo largo de una dimensión continua (espacio, tiempo, edad). En lugar de que cada grupo tenga un intercepto independiente, los interceptos están correlacionados — los puntos cercanos son más similares. La función de covarianza determina cómo decae la similitud con la distancia. Esto hace a los PG increíblemente flexibles: pueden modelar variación espacial, tendencias temporales y cualquier covariable continua donde los valores cercanos deban ser similares. La escala de longitud ℓ\ell es el parámetro clave — le dice al modelo hasta dónde se extiende la influencia "local".

Overthinking

El truco del kernel. El proceso Gaussiano funciona porque la matriz de covarianza codifica similitud. El kernel exponencial cuadrado k(x,x′)=σ2exp⁡(−(x−x′)2/(2ℓ2))k(x, x') = \sigma^2 \exp(-(x-x')^2 / (2\ell^2)) es solo una elección. Otras incluyen:

  • Matérn: Más rugoso que el exponencial cuadrado, más realista para procesos físicos.
  • Periódico: k(x,x′)=σ2exp⁡(−2sin⁡2(π∣x−x′∣/p)/ℓ2)k(x, x') = \sigma^2 \exp(-2\sin^2(\pi|x-x'|/p) / \ell^2) — captura estacionalidad.
  • Cuadrático racional: Una mezcla de escalas de exponenciales cuadrados — maneja múltiples escalas de longitud.

La elección del kernel es una decisión de modelado — codifica supuestos sobre cómo se comporta la función.

Resumen de la Sección 13.4

  • Los procesos Gaussianos modelan categorías continuas como efectos aleatorios correlacionados.
  • El kernel exponencial cuadrado: Cov(f(x),f(x′))=σ2exp⁡(−(x−x′)2/(2ℓ2))\text{Cov}(f(x), f(x')) = \sigma^2 \exp(-(x-x')^2 / (2\ell^2)).
  • La escala de longitud ℓ\ell controla la suavidad — mayor ℓ\ell = funciones más suaves.
  • Los PG son interceptos variables para dimensiones continuas (espacio, tiempo).
  • La elección del kernel codifica supuestos sobre el comportamiento de la función.