Resumen

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

# Datos
X = np.array([
    [80, 3],
    [120, 3],
    [100, 2],
    [150, 4]
])

y = np.array([310, 390, 325, 530])  # miles de dólares

# Visualización
plt.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 bias
X_bias = np.c_[np.ones((4, 1)), X]

# Componentes de la ecuación normal
A = 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?