Resumen

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.