Cómo resolver theta con np.linalg.solve
Clase 13 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
Aprende a calcular los pesos de un modelo de regresión lineal usando álgebra lineal, la ecuación normal y las funciones de NumPy. Verás por qué np.linalg.solve es preferido frente a la inversa, cómo interpretar el intercepto y cómo generar predicciones y la línea de mejor ajuste con Matplotlib.
¿Cómo resolver theta con NumPy de forma eficiente?
La idea central: si A es invertible en AX = B, entonces X = A⁻¹B. Eso nos da una solución directa para los pesos (theta). Sin embargo, profesionalmente es mejor usar np.linalg.solve para resolver el sistema sin calcular la inversa: es más rápido y estable numéricamente en matrices grandes.
# Suponiendo que A, B, X, X_bias y y ya están definidos
import numpy as np
# 1) Verificar invertibilidad básica
print(np.linalg.norm(A) > 0) # True si la norma es > 0
print(A.shape) # ejemplo: (3, 3)
# 2) Inversa de A (opción teórica)
A_inv = np.linalg.inv(A)
theta_inv = A_inv @ B
print("Pesos (inversa):", np.round(theta_inv, 2))
# 3) Resolver con solve (recomendado)
theta_solve = np.linalg.solve(A, B)
print("Pesos (solve):", np.round(theta_solve, 2))
¿Por qué evitar calcular la inversa?
- Porque es costoso computacionalmente en matrices grandes.
- Porque puede ser numéricamente inestable.
- Porque solve resuelve el sistema directamente y es más robusto.
¿Qué validar para que A sea invertible?
- Que la norma de A sea mayor a cero.
- Que A sea matriz cuadrada (por ejemplo, 3x3).
¿Qué roles cumplen intercepto, bias y pesos?
El primer peso es el intercepto: el precio base antes de considerar características. En términos prácticos, es lo que el modelo predice para una casa con cero metros cuadrados y cero habitaciones. A partir de ahí, el modelo suma o resta valor en función de cada columna de X: por ejemplo, metros cuadrados y número de habitaciones.
- Bias: columna de unos añadida al inicio de X para aprender el intercepto.
- Pesos: coeficientes que multiplican cada característica.
- Mejor aproximación: cuando el sistema es inconsistente, proyectamos Y de forma ortogonal sobre el espacio columna de X; eso produce las predicciones.
- Ecuación normal: permite despejar theta a partir de los componentes A y B que calculaste previamente.
¿Cómo predecir y trazar la mejor línea de ajuste?
Con theta calculado, puedes predecir con X_bias y comparar contra los precios reales. Luego, grafica los datos y la línea de regresión para verificar el ajuste visualmente.
# Usamos la solución con solve
theta = theta_solve
# Predicciones sobre el conjunto con bias
predicciones = X_bias @ theta
print("Precios reales:", np.round(y, 2))
print("Precios predichos:", np.round(predicciones, 2))
# Visualización de datos y línea de mejor ajuste
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], y, color="blue", label="Datos reales")
# Dos casas nuevas para trazar la línea (metros cuadrados): 50 y 160
X_line = np.array([[50],
[160]])
# Agregamos bias y número de habitaciones (2 y 4)
X_line_bias = np.c_[np.ones((2, 1)), X_line, np.array([[2], [4]])]
y_line = X_line_bias @ theta
print("Proyecciones:", np.round(y_line, 2))
plt.plot(X_line.ravel(), y_line, "r-", label="Línea de regresión lineal")
plt.xlabel("metros cuadrados")
plt.ylabel("precio en miles")
plt.title("Nuestro modelo de regresión lineal")
plt.grid(True)
plt.legend()
plt.show()
¿Cómo resolver el ejercicio propuesto?
Calcula el precio para una casa de 130 m² con 3 habitaciones. Recuerda incluir el bias al inicio y hacer el producto punto con theta.
casa = np.array([1, 130, 3])
precio_130_3 = casa @ theta
print(np.round(precio_130_3, 2))
- Construye el vector con bias al inicio.
- Multiplica por theta con producto punto.
- Redondea a dos decimales para interpretar con claridad.
Comparte tu resultado y comenta cómo te fue al usar np.linalg.solve frente a la inversa.