← Regresión lineal aplicada con Python
Matemáticas de la regresión lineal
Preview gratis Sección 1 · Fundamentos de OLS e interpretación
En este video
- Ves que mínimos cuadrados minimiza la suma de residuos al cuadrado, que en los 342 pingüinos vale 52.85 millones, y por qué el cuadrado evita que los signos se cancelen
- Recorres la curva de pérdida como parábola en la pendiente y derivas que la pendiente es la covarianza entre la varianza de x, comprobado con np.cov: 49.69 g/mm
- Armas la matriz de diseño, planteas las ecuaciones normales y ves la solución como una proyección ortogonal con residuos perpendiculares a las columnas de X
- Resuelves con np.linalg.lstsq y compruebas que X transpuesta por e da cero en las tres columnas
- Comparas el número de condición de X (2980) con el de X'X (8.9 millones) y ves por qué lstsq responde cuando inv falla con la aleta duplicada
# Datos y preparación que el video da por hechos: ejecuta esto antes del resto del código.
import numpy as np
import seaborn as sns
df = sns.load_dataset("penguins").dropna(
subset=["body_mass_g", "flipper_length_mm", "bill_length_mm"])
x = df["flipper_length_mm"]
y = df["body_mass_g"]
c = np.cov(x, y)
b1 = c[0, 1] / c[0, 0]
b0 = y.mean() - b1 * x.mean()
print(round(c[0, 1], 1), round(c[0, 0], 2))
print(round(b1, 2), round(b0, 2))
X = np.column_stack([np.ones(len(df)),
df["flipper_length_mm"], df["bill_length_mm"]])
y = df["body_mass_g"].to_numpy()
beta, *_ = np.linalg.lstsq(X, y, rcond=None)
e = y - X @ beta
print(beta.round(2))
print((X.T @ e).round(6))
print(round(np.linalg.cond(X)))
print(round(np.linalg.cond(X.T @ X)))
b_inv = np.linalg.inv(X.T @ X) @ X.T @ y
print(f"{np.abs(b_inv - beta).max():.0e}")