Contenido del curso
Operaciones con Vectores y Matrices
Multiplicación de Matrices
Construcción de un Modelo de Regresión Lineal
Regresión lineal resuelta con álgebra lineal
Resumen
Resolver la ecuación normal Aθ = B es el momento en que el álgebra lineal deja de ser teoría y se convierte en un modelo de regresión que predice precios reales. Aquí vas a despejar el vector de pesos theta usando dos caminos en NumPy, comparar resultados y graficar la línea de mejor ajuste sobre tus datos.
¿Cómo despejar theta usando la inversa de A?
Partimos de Aθ = B. Si A es invertible, multiplicas ambos lados por su inversa y obtienes θ = A⁻¹B. Es la solución teóricamente perfecta y el primer camino que vale la pena recorrer para entender qué está pasando por debajo.
Antes de invertir, conviene verificar dos cosas: que A sea cuadrada y que su norma sea distinta de cero. Con A.shape confirmas que es una matriz 3x3 y con np.linalg.norm(A) confirmas que su norma es mayor a cero, así que es invertible.
El flujo en código se ve así:
python A_inversa = np.linalg.inv(A) theta_inv = A_inversa @ B print(f"Pesos del modelo theta: {np.round(theta_inv, 2)}")
El resultado son los pesos óptimos. Cada número corresponde a una columna de tus datos: el primero es el intercepto (la columna de bias), el segundo los metros cuadrados y el tercero el número de habitaciones [04:30].
¿Qué significa el intercepto en una regresión lineal?
Piensa en el intercepto como el precio de partida de una casa antes de considerar sus características. Es lo que el modelo predice para una casa teórica con cero metros cuadrados y cero habitaciones. A partir de ese punto de referencia, el modelo suma o resta valor según cada feature.
¿Qué es el intercepto en un modelo de regresión? Es el valor base que predice el modelo cuando todas las variables independientes son cero. Funciona como el ancla desde la cual se ajustan las predicciones según las características.
¿Por qué usar np.linalg.solve en vez de la inversa?
Calcular la inversa es correcto, pero en la práctica profesional rara vez se hace. Es computacionalmente costoso y puede ser numéricamente inestable con matrices grandes. El método preferido resuelve el sistema directamente sin invertir nada.
En NumPy ese atajo vive en np.linalg.solve:
python theta_solve = np.linalg.solve(A, B) print(f"Pesos del modelo theta: {np.round(theta_solve, 2)}")
Al comparar ambos métodos, los resultados son idénticos en este caso. La diferencia se nota cuando las matrices crecen: solve es más rápido y más robusto numéricamente [07:40].
¿Cuándo usar np.linalg.solve y cuándo np.linalg.inv? Usa
solvepor defecto para resolver sistemas lineales: es más rápido y estable. Usainvsolo cuando necesitas la matriz inversa explícitamente para otros cálculos.
¿Cómo predecir precios con el vector theta entrenado?
Con theta resuelto, las predicciones son una sola multiplicación matricial entre tu matriz de datos con bias y el vector de pesos:
python theta = theta_solve predicciones = X_bias @ theta print(f"Precios reales: {y}") print(f"Precios predichos: {np.round(predicciones, 2)}")
Estas son las aproximaciones que arroja el modelo frente a los precios reales:
- Casa 1: real 310, predicho 308.
- Casa 2: real 390, predicho 407.37.
- Casa 3: real 325, predicho 317.28.
- Casa 4: real 530, predicho 522.28.
Ninguna predicción cae exactamente sobre el precio real, y eso es esperado. Lo que tienes es la mejor línea de ajuste posible para esos datos [09:50].
¿Cómo graficar la línea de mejor ajuste con matplotlib?
Para dibujar la recta de regresión, construyes dos puntos sintéticos, les agregas el bias y el número de habitaciones, y los multiplicas por theta:
python plt.figure(figsize=(8, 6)) plt.scatter(X[:, 0], y, color='blue', label='Datos reales')
X_linea = np.array([[50], [160]]) X_linea_bias = np.c_[np.ones((2, 1)), X_linea, np.array([[2], [4]])] y_linea = X_linea_bias @ theta
plt.plot(X_linea, y_linea, 'r-', label='Línea de regresión lineal') plt.xlabel('Metros cuadrados') plt.ylabel('Precio en miles') plt.title('Modelo de regresión lineal') plt.grid() plt.legend() plt.show()
El resultado es una línea roja atravesando la nube de puntos azules. Visualmente confirmas que entrenaste un modelo de regresión lineal usando únicamente álgebra lineal [12:30].
¿Qué resolvió realmente la ecuación normal?
Tus datos no formaban una línea perfecta. En lenguaje de álgebra lineal, el vector de precios reales y estaba fuera del espacio columna de la matriz X, lo que hacía el sistema Xθ = y inconsistente: no existía solución exacta.
La salida fue buscar la mejor aproximación posible, que en términos geométricos es la proyección ortogonal de y sobre el espacio columna de X. Esa proyección, la sombra de y en el plano, es justo el vector de predicciones que calculaste.
La ecuación normal fue la herramienta que permitió pasar de un sistema sin solución a un sistema resoluble con componentes A y B, listos para despejar theta con inv o con solve [14:20].
Ahora un reto: usa el vector theta que calculaste y predice el precio de una casa de 130 metros cuadrados con 3 habitaciones. Construye el vector [1, 130, 3] con el bias al inicio, calcula el producto punto con theta y comparte tu resultado en los comentarios.