Resumen

La multicolinealidad puede convertir un entrenamiento en un callejón sin salida. Aquí verás cómo la singularidad emerge cuando hay características redundantes, por qué el determinante y el rango son tus pruebas clave y cómo la matriz de Gram y la ecuación normal se quiebran en la práctica con NumPy en Google Colab.

¿Qué es la singularidad y por qué la causa la multicolinealidad?

Cuando dos o más columnas en X contienen la misma información, se vuelven linealmente dependientes. Ejemplos claros: convertir “metros cuadrados” a “centímetros cuadrados” o duplicar “habitaciones”. No hay nueva información, solo una versión escalada.

¿Cómo se manifiesta la dependencia lineal en X?

  • Columnas equivalentes por escala, como m² y pies² (factor 10.764).
  • Duplicación de una variable, como “habitaciones” y una copia de “habitaciones”.
  • Consecuencia: la matriz de Gram XᵀX se vuelve singular.
  • Signo inequívoco: determinante igual a cero.
  • Implicación: no existe inversa, no hay solución única para la ecuación normal.

¿Qué problemas genera en el modelo?

  • Ambigüedad en la solución: hay infinitos vectores de pesos que explican igual los datos.
  • Inestabilidad extrema: con determinante cercano a cero, pequeñas variaciones en la entrada cambian drásticamente los pesos.
  • Falta de interpretabilidad: los pesos no son fiables para estimar la importancia de cada característica.

¿Cómo diagnosticarlo en Google Colab con NumPy?

El procedimiento práctico reproduce la multicolinealidad agregando una columna redundante y luego mediendo determinante y rango. Finalmente, se prueba la inversión y la resolución del sistema.

¿Cómo crear la característica redundante?

  • Tomar la primera columna de X: X[:, 0].
  • Convertir m² a pies² multiplicando por 10.764: crear “pies2”.
  • Concatenar con np.c_ para formar X_enfermo.
  • Agregar bias con una columna de ones de forma 4,1 y concatenarla: X_enfermo_bias.
  • Verificar al imprimir: la última columna replica la segunda en otra escala.

¿Qué métricas revisar: determinante y rango?

  • Calcular A_enfermo = X_enfermo_biasᵀ X_enfermo_bias y B = X_enfermo_biasᵀ y.
  • Usar np.linalg.det(A_enfermo): devuelve 0, alerta roja de singularidad.
  • Usar np.linalg.matrix_rank(A_enfermo): da 3, confirmando que no hay inversa.

¿Qué pasa al intentar resolver la ecuación normal?

  • Intentar np.linalg.inv(A_enfermo) @ B: error “singular matrix”.
  • Intentar np.linalg.solve(A_enfermo, B): mismo error.
  • Conclusión: el modelo no se puede entrenar con esta X.

¿Qué experimentar ahora y cuál es la salida cuando falla la inversa?

Pequeños cambios rompen la dependencia perfecta. Eso permite observar cómo pasa de singularidad exacta a mal condicionamiento, donde aún hay riesgos de inestabilidad, pero ya es posible probar la inversión o un solver.

¿Qué cambios probar para romper la redundancia?

  • Modificar ligeramente un valor en la última columna de X_enfermo.
  • Dejar de usar exactamente 10.764 como factor en al menos una fila.
  • Recalcular A_enfermo, B, determinante y rango.

¿Qué observar después del cambio?

  • El determinante deja de ser 0 o se vuelve un número muy pequeño.
  • np.linalg.inv y np.linalg.solve pueden funcionar, pero con potencial inestabilidad si el determinante es diminuto.
  • Los pesos serán menos indeterminados; la interpretación aún puede ser frágil si hay alta multicolinealidad.

¿Con qué herramienta continuar cuando no existe inversa?

  • Usar la seudoinversa: permite obtener la mejor solución posible incluso cuando no hay solución perfecta para la ecuación normal.

¿Ya probaste el experimento y mediste el determinante, el rango y el comportamiento de inv y solve? Comparte tus resultados y lo que observaste en la estabilidad de los pesos.