La regresión lineal permite estimar precios de viviendas con el poder del álgebra lineal. A partir de datos reales, se formula Xθ = y para encontrar los pesos θ que generan la línea de mejor ajuste. Con un ejemplo de cuatro casas y dos características, se prepara el sistema y se construyen sus componentes: matriz de Gram y vector B, listos para resolver mediante la ecuación normal.
¿Qué resuelve la regresión lineal para precios de viviendas?
La meta es ajustar una línea o plano que minimice el error entre predicciones y valores reales. Para precios, la hipótesis es: precio = θ0 + θ1·metros cuadrados + θ2·habitaciones. Con notación matricial, se escribe Xθ = y, donde X es la matriz de características, y el vector de precios y θ el vector de pesos.
Mejor ajuste: línea roja que se aproxima a los puntos azules de datos reales.
Hipótesis paramétrica: θ0, θ1 y θ2 son el conocimiento del modelo.
Ecuación normal: se busca θ resolviendo XᵀX θ = Xᵀy.
Objetivo práctico: predecir el precio con base en metros cuadrados y habitaciones.
¿Cómo aplicar la ecuación normal con NumPy paso a paso?
Se trabaja en Google Colab con NumPy y Matplotlib. Primero, se define el conjunto de datos y se visualiza para ver si una sola línea pasa por todos los puntos (no necesariamente).
Crear X con dos columnas: metros cuadrados y habitaciones.
Crear y con los precios reales en miles de dólares.
Graficar dispersión para inspección visual.
Agregar bias (columna de unos) para incluir el término θ0.
Construir A = XᵀX y B = Xᵀy para la ecuación normal.
import numpy as np
import matplotlib.pyplot as plt
# DatosX = np.array([[80,3],[120,3],[100,2],[150,4]])y = np.array([310,390,325,530])# miles de dólares# Visualizaciónplt.figure(figsize=(8,6))plt.scatter(X[:,0], y, color='blue', label='datos reales de las casas')plt.xlabel('metros cuadrados')plt.ylabel('precio')plt.title('¿será que podemos ajustar una línea perfecta en estos datos?')plt.grid(True)plt.legend()plt.show()# Agregar biasX_bias = np.c_[np.ones((4,1)), X]# Componentes de la ecuación normalA = X_bias.T @ X_bias
B = X_bias.T @ y
print(f"matriz A:\n{A}")print(f"vector B:\n{B}")
X_bias: añade una columna de unos para evitar forzar la línea a pasar por el origen.
A y B listos: el sistema Aθ = B queda planteado para resolver los pesos óptimos.
¿Por qué la matriz de Gram y el vector B importan?
La matriz de Gram A = XᵀX condensa la estructura del conjunto de datos. Resume la importancia individual de cada característica y cómo se relacionan entre sí. En el ejemplo, los metros cuadrados dominan numéricamente por su rango mayor (de 80 a 150) frente a habitaciones (de 2 a 4), por eso aparecen valores más grandes asociados a esa característica. Es un mapa compacto de relevancias y correlaciones.
Importancia individual: qué tanta “fuerza” tiene cada característica por sí sola.
Relación entre características: si más metros cuadrados suelen implicar más habitaciones.
Escala de valores: rangos altos generan números grandes en A.
El vector B = Xᵀy captura la conexión entre cada característica y el precio objetivo. Un valor alto indica que esa característica aporta una pista fuerte para estimar el precio. El primer elemento refleja la columna de unos del bias; los siguientes vinculan directamente metros cuadrados y habitaciones con el precio.
Conexión con el objetivo: mide la asociación entre características y precio.
Prioridad práctica: metros cuadrados tiende a destacar por su magnitud numérica.
Preparación final: con A y B definidos, queda resolver para θ y obtener la línea de mejor ajuste.
Antes de resolver, te invito a participar: comparte en comentarios la forma (shape) de la matriz A que obtuviste. ¿Es cuadrada? ¿Por qué crees que esto es importante para el siguiente paso al resolver el sistema?