Pseudoinversa para multicolinealidad en NumPy
Clase 16 de 16 • Curso de Álgebra Lineal para Machine Learning
Contenido del curso
Operaciones con Vectores y Matrices
Multiplicación de Matrices
Construcción de un Modelo de Regresión Lineal
Cuando la multicolinealidad rompe tu matriz y el entrenamiento falla, la solución no es rendirse. Con NumPy y la seudoinversa de Moore-Penrose, puedes obtener la mejor aproximación por mínimos cuadrados incluso cuando la matriz es singular. Además, cuando hay infinitas soluciones, esta técnica elige la solución de mínima norma, la más simple y estable. Todo con código claro en Google Colab y verificación visual con matplotlib.
¿Cómo rescatar una regresión con multicolinealidad usando la seudoinversa?
La multicolinealidad genera matrices singulares y hace que métodos como inv o solve fallen. La seudoinversa generaliza la inversa para cualquier matriz: cuadrada, rectangular o singular. En regresión, devuelve los pesos theta que minimizan el error cuadrático. Y si hay infinitas soluciones, selecciona la única con norma más pequeña. Es decir, la más estable. También conecta con la técnica SVD (descomposición en valores singulares).
En el ejemplo, duplicar una columna (metros cuadrados y pies cuadrados) vuelve el conjunto “enfermo”. Al usar la seudoinversa, los pesos de las columnas linealmente dependientes aparecen con valores muy pequeños, reflejando esa redundancia.
- Multicolinealidad: columnas duplicadas que introducen dependencia lineal.
- Matriz singular: error al intentar invertir con inv.
- Seudoinversa o inversa de Moore-Penrose: np.linalg.pinv.
- Mínimos cuadrados: minimiza el error cuadrático.
- Solución de mínima norma: el vector theta más corto entre infinitas soluciones.
- Proyecciones ortogonales: mejor ajuste posible sobre los datos reales.
¿Cuál es el flujo en NumPy para calcular theta y predecir?
Primero se forman las ecuaciones normales con la matriz “enferma” y su bias. Intentar invertir falla por singularidad. Con la seudoinversa, en cambio, se obtiene theta y se puede predecir sin errores.
import numpy as np
# Supón que ya tienes X_enfermo_bias y y definidos.
A_enfermo = X_enfermo_bias.T @ X_enfermo_bias
B = X_enfermo_bias.T @ y
# Esto falla por matriz singular:
# np.linalg.inv(A_enfermo) @ B
# Seudoinversa de Moore-Penrose:
A_pinv = np.linalg.pinv(A_enfermo)
# Pesos que minimizan el error cuadrático (mínimos cuadrados):
theta = A_pinv @ B
# Predicciones sobre el conjunto “enfermo”:
predicciones = X_enfermo_bias @ theta
np.round(predicciones, 2)
¿Qué tan cercanas son las predicciones a los precios reales?
Incluso con multicolinealidad, las aproximaciones son cercanas.
- Casa 1: real 310, predicción 308.07.
- Casa 2: real 390, predicción 407.37.
- Casa 3: real 325, predicción 317.28.
- Casa 4: real 530, predicción 522.00.
Esto valida que la seudoinversa resuelve el entrenamiento cuando inv o solve no pueden.
¿Cómo visualizar la línea de regresión y validar el ajuste?
Se grafican los datos reales con scatter y la línea de regresión con plot. Para trazar la recta, se crean nuevas casas de prueba con sus características, se añade el bias y se calculan las predicciones. La línea en rojo representa la proyección ortogonal que mejor se ajusta a los datos.
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
# Dispersión de datos reales (ejemplo: eje x con metros cuadrados).
plt.scatter(X_enfermo[:, 0], y, color='blue', label='datos reales de las casas')
# Dos nuevas casas para dibujar la línea (50 y 160 m²).
x_line = np.array([[50], [160]])
# Añadimos bias y el resto de columnas (habitaciones y pies cuadrados).
x_line_bias = np.c_[
np.ones((2, 1)),
x_line,
np.array([[2], [4]]), # habitaciones
np.array([[538], [1722]]) # pies cuadrados aprox.
]
# Predicción sobre la línea.
y_line_pred = x_line_bias @ theta
# Línea de regresión con seudoinversa.
plt.plot(x_line, y_line_pred, color='red', label='línea de regresión lineal con pinv')
plt.xlabel('metros cuadrados')
plt.ylabel('predicción miles')
plt.grid(True)
plt.legend()
plt.show()
¿Te animas a profundizar? Investiga por qué, con infinitas soluciones en presencia de multicolinealidad, la seudoinversa devuelve la solución de mínima norma. Pista: entre todas las combinaciones de theta que resuelven el sistema, elige el vector más corto. Comparte tu explicación en los comentarios y cuéntanos qué hallaste.