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 definidosimport numpy as np
# 1) Verificar invertibilidad básicaprint(np.linalg.norm(A)>0)# True si la norma es > 0print(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 solvetheta = theta_solve
# Predicciones sobre el conjunto con biaspredicciones = 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 ajusteimport 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 160X_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.