Dos operaciones sobre una matriz cuadrada admiten una lectura inmediata: la inversa deshace la transformación que la matriz aplica, y la transpuesta intercambia el papel de filas y columnas. La primera plantea una cuestión de existencia que un solo número resuelve; la segunda genera la clase de matrices sobre la que descansa buena parte del aprendizaje automático.
La matriz inversa
Una matriz es invertible si existe tal que
La inversa, cuando existe, es única, y representa la transformación que devuelve cada vector a su posición de partida.
import numpy as np
A = np.array([[1., 2.],
[3., 4.]])
Ainv = np.linalg.inv(A)
np.allclose(A @ Ainv, np.eye(2)) # True
Existencia: el determinante
El criterio es un único escalar. La matriz es invertible si y solo si , condición equivalente a que sus columnas sean linealmente independientes.
np.linalg.det(A)
# -2.0000000000000004
El valor exacto es . La discrepancia en el decimoquinto dígito es aritmética de coma flotante, no un error de cálculo: los números reales se representan con precisión finita y las operaciones acumulan redondeo.
De ahí una regla que conviene aplicar sin excepciones: el determinante no se compara con cero mediante ==.
np.linalg.det(A) == 0 # False, pero por la razón equivocada
np.isclose(np.linalg.det(A), 0) # la comparación correcta
Cuando la matriz es exactamente singular, inv no devuelve un resultado aproximado sino un error:
S = np.array([[1., 2.],
[2., 4.]]) # fila 2 = 2 · fila 1
np.linalg.inv(S)
# LinAlgError: Singular matrix
El número de condición
El caso singular es el benigno, porque falla de forma visible. El problemático es la matriz casi singular: inv devuelve un resultado, el programa continúa y las cifras carecen de significado.
La magnitud que lo cuantifica es el número de condición . En la norma es el cociente entre el mayor y el menor valor singular, y acota la propagación del error relativo al resolver :
En la figura, el parámetro separa la segunda fila de un múltiplo exacto de la primera. El término independiente se perturba siempre en la misma cantidad, y lo que se observa es cuánto de esa perturbación llega a la solución.
- det(A)
- 0.500
- cond(A)
- 58.5
- cambio en b
- 0.015 %
- cambio en x
- 0.15 %
ε separa la segunda fila del doble de la primera. En ε = 0 la matriz es singular.
Con próximo a la perturbación llega atenuada. Al reducir hacia cero, una variación de milésimas en produce variaciones de orden uno en . El sistema sigue teniendo solución única en sentido matemático, pero la solución calculada deja de ser informativa.
np.linalg.cond(A) # ~14.9 para la matriz de arriba
Como orden de magnitud: si , cabe esperar la pérdida de unas cifras significativas. En doble precisión se dispone de unas 16, de modo que deja apenas cuatro cifras fiables.
La recomendación de la lección sobre sistemas lineales —emplear solve y no inv— se apoya en esto: solve evita construir la inversa y con ello una fuente adicional de amplificación del error.
La transpuesta
La transpuesta de una matriz se define por : refleja la matriz respecto de su diagonal principal, que permanece fija.
a11 = 1 → (Aᵀ)11 = 1
La diagonal queda fija; el resto de entradas intercambia sus índices.
Paso 1 / 6
A = np.array([[1, 2, 3],
[4, 5, 6]])
A.T
# array([[1, 4],
# [2, 5],
# [3, 6]])
En NumPy, .T devuelve una vista: no copia los datos, solo intercambia el orden en que se recorren. La operación es de coste constante, igual que reshape. De la definición se sigue .
La inversión del orden
Tanto la transposición como la inversión invierten el orden de los factores de un producto:
La razón es la misma en ambos casos. Si significa aplicar y después , deshacer esa composición exige deshacer primero lo último que se hizo. La comprobación numérica es inmediata:
P = np.random.randn(2, 3)
Q = np.random.randn(3, 2)
np.allclose((P @ Q).T, Q.T @ P.T) # True
Las dimensiones lo confirman por sí solas: no está definido en general, mientras que siempre lo está.
Matrices simétricas
Una matriz cuadrada es simétrica cuando . La construcción que las produce de forma sistemática es el producto de una matriz por su transpuesta:
El resultado es simétrico cualquiera que sea , incluso rectangular. Para , el producto es de orden .
A = np.random.randn(4, 3)
G = A.T @ A # 3×3
np.allclose(G, G.T) # True
Además de simétrica, es semidefinida positiva: para todo se cumple . Esa propiedad garantiza que sus valores propios son reales y no negativos.
La clase aparece por todas partes en aprendizaje automático, y siempre por la misma razón: procede de un producto de la forma .
| Objeto | Construcción | Dónde aparece |
|---|---|---|
| Matriz de covarianza | PCA, blanqueo de datos | |
| Matriz de Gram o kernel | máquinas de vectores soporte, procesos gaussianos | |
| Hessiana | métodos de segundo orden, análisis de curvatura |
El interés práctico de la simetría es que garantiza valores propios reales y una base ortogonal de vectores propios, lo que permite descomponer la matriz de forma estable. Sobre esa garantía se apoya el análisis de componentes principales.
Aplicación: las ecuaciones normales
La regresión lineal busca los pesos que minimizan , donde cada fila de es una observación. Anulando el gradiente se obtienen las ecuaciones normales:
La expresión de la derecha es la forma habitual en los textos, y es la que no conviene trasladar al código. La matriz eleva al cuadrado el número de condición de , , de modo que un problema moderadamente mal condicionado se vuelve severo al formar ese producto. Sobre esa matriz, además, se invierte.
w = np.linalg.solve(A.T @ A, A.T @ b) # aceptable
w = np.linalg.lstsq(A, b, rcond=None)[0] # preferible
lstsq resuelve el problema de mínimos cuadrados sin formar , empleando una factorización QR o la descomposición en valores singulares, y conserva el condicionamiento original.
La transpuesta reaparece en el entrenamiento de redes neuronales. Si la propagación hacia adelante de una capa es , el gradiente respecto de la entrada se propaga hacia atrás multiplicando por :
La transposición es lo que hace encajar las dimensiones: tiene la forma de , y multiplicar por la devuelve a la forma de . Cada paso de retropropagación es, en esencia, un producto por la transpuesta de los pesos.
Ejercicio. Para , comprobar que . Calcular np.linalg.cond(A) para , y , y estimar en cada caso cuántas cifras significativas sobreviven en doble precisión.