Una factorización de Cholesky tiene más sentido para la mejor estabilidad y velocidad cuando se trabaja con una matriz de covarianza, ya que la matriz de covarianza será una matriz simétrica semi-definida positiva. Cholesky es un natural aquí. PERO...
SI tiene la intención de calcular una factorización de Cholesky, antes de calcular la matriz de covarianza, hágase un favor. Haga que el problema sea lo más estable posible calculando una factorización QR de su matriz. (Un QR también es rápido). Es decir, si calcula la matriz de covarianza como
do= ATUNA
donde ha tenido la columna significa eliminada, luego vea que cuando forma , cuadra el número de condición. Así que mejor es formar los factores QR de en lugar de computar explícitamente una factorización de Cholesky de .C A A T AUNAdoUNAUNATUNA
A = Q R
Como Q es ortogonal,
C=(QR)TQR=RTQTQR=RTIR=RTR
Así obtenemos el factor Cholesky directamente de la factorización QR, en forma de . Si un -menos factorización QR está disponible, esto es aún mejor, ya que no es necesario . Un QR sin es algo rápido de calcular, ya que nunca se genera. Se convierte simplemente en una secuencia de transformaciones del Jefe de familia. (Una columna pivoteada, -less QR sería lógicamente aún más estable, a costa de un poco de trabajo extra para elegir los pivotes). Q Q Q Q QRTQQQQQ
La gran virtud de usar el QR aquí es que es muy estable numéricamente en problemas desagradables. Nuevamente, esto se debe a que nunca tuvimos que formar la matriz de covarianza directamente para calcular el factor Cholesky. Tan pronto como forme el producto , cuadrará el número de condición de la matriz. Efectivamente, pierde información en las partes de esa matriz donde originalmente tenía muy poca información para comenzar.ATA
Finalmente, como señala otra respuesta, ni siquiera necesita calcular y almacenar el inverso, sino usarlo implícitamente en forma de soluciones de retroceso en sistemas triangulares.
Hice esto por primera vez recientemente, utilizando las sugerencias de mathSE.
SVD fue recomendado por la mayoría, creo, pero opté por la simplicidad de Cholesky:
Si la matriz , descompongo en una matriz triangular usando Cholesky, de modo que . Luego uso la sustitución hacia atrás o hacia adelante (dependiendo de si elijo que L sea triangular superior o inferior), para invertir , de modo que tenga . A partir de esto, puedo calcular rápidamente .M=AA⊤ M L M=LL⊤ L L−1 M−1=(LL⊤)−1=L−⊤L−1
Empezar con:
Factorización de Cholesky:
Reemplazo de espalda:
Multiplicación:
Notación utilizada: los índices inferiores son filas, los índices superiores son columnas y es la transposición deL- ⊤ L- 1
Mi algoritmo Cholesky (probablemente de Recetas Numéricas o Wikipedia)
Esto casi puede hacerse en el lugar (solo necesita almacenamiento temporal para los elementos diagonales, un acumulador y algunos iteradores enteros).
Mi algoritmo de sustitución de espalda (de Numerical Recipes, verifique su versión, ya que puede haber cometido un error con el marcado LaTeX)
A medida que aparece en la expresión, el orden que itera sobre la matriz es importante (algunas partes de la matriz de resultados dependen de otras partes que deben calcularse de antemano). Consulte el código de Recetas numéricas para ver un ejemplo completo en código. [Editar]: En realidad, solo verifique el ejemplo de Recetas numéricas. He simplificado demasiado el uso de productos de punto, hasta el punto de que la ecuación anterior tiene una dependencia cíclica, sin importar el orden que repita ...L- T
fuente
Si sabe que la matriz tiene un inverso (es decir, si es realmente positivo definido) y si no es demasiado grande, entonces la descomposición de Cholesky proporciona un medio apropiado para caracterizar el inverso de una matriz.
fuente