Uma fatoração de Cholesky faz mais sentido para a melhor estabilidade e velocidade quando você está trabalhando com uma matriz de covariância, uma vez que a matriz de covariância será uma matriz simétrica semi-definida positiva. Cholesky é natural aqui. MAS...
Se você pretende calcular uma fatoração de Cholesky, antes de calcular a matriz de covariância, faça um favor a si mesmo. Torne o problema estável ao máximo, calculando uma fatoração QR da sua matriz. (Um QR também é rápido.) Ou seja, se você calcular a matriz de covariância como
C=ATA
onde teve os meios da coluna removidos, veja que quando você forma , ele quadratura o número da condição. Então é melhor é formar os fatores de QR de em vez de computação explicitamente uma fatoração de Cholesky de .C A A T AACAATA
A=QR
Como Q é ortogonal,
C=(QR)TQR=RTQTQR=RTIR=RTR
Assim, obtemos o fator de Cholesky diretamente da fatoração QR, na forma de . Se um -menos fatoração QR está disponível, este é ainda melhor desde que você não precisa . Um QR sem é uma coisa rápida de calcular, pois nunca é gerado. Torna-se apenas uma sequência de transformações de chefe de família. (Uma coluna dinâmica, o QR sem seria logicamente ainda mais estável, com o custo de algum trabalho extra para escolher as dinâmicas.) Q Q Q Q QRTQQQQQ
A grande virtude de usar o QR aqui é que ele é altamente numericamente estável em problemas desagradáveis. Novamente, isso ocorre porque nunca tivemos que formar a matriz de covariância diretamente para calcular o fator de Cholesky. Assim que você formar o produto , você quadrará o número da condição da matriz. Efetivamente, você perde informações nas partes dessa matriz em que originalmente tinha muito pouca informação para começar.ATA
Finalmente, como outra resposta aponta, você nem precisa calcular e armazenar o inverso, mas usa-o implicitamente na forma de backsolves em sistemas triangulares.
Fiz isso pela primeira vez recentemente, usando sugestões do mathSE.
Acho que o SVD foi recomendado pela maioria, mas optei pela simplicidade de Cholesky:
Se a matriz , decomponho em uma matriz triangular usando Cholesky, de modo que . Em seguida, uso a substituição traseira ou substituição anterior (dependendo de escolher L como triangular superior ou inferior), para inverter , de modo que eu tenha . Com isso, posso calcular rapidamente .M=AA⊤ M L M=LL⊤ L L−1 M−1=(LL⊤)−1=L−⊤L−1
Começar com:
Fatoração de Cholesky:
Substituição traseira:
Multiplicação:
Notação usada: índices inferiores são linhas, índices superiores são colunas e é a transposição deL−⊤ L−1
Algoritmo My Cholesky (provavelmente de Numerical Recipes ou Wikipedia)
Isso quase pode ser feito no local (você só precisa de armazenamento temporário para os elementos diagonais, um acumulador e alguns iteradores inteiros).
Meu algoritmo de substituição traseira (de Numerical Recipes, verifique sua versão, pois eu posso ter cometido um erro com a marcação LaTeX)
Como aparece na expressão, a ordem que você itera sobre a matriz é importante (algumas partes da matriz de resultados dependem de outras partes dela que devem ser calculadas previamente). Verifique o código de Receitas numéricas para obter um exemplo completo no código. [Editar]: Na verdade, basta verificar o exemplo de Receitas numéricas. Eu simplifiquei demais usando produtos de ponto, a ponto de a equação acima ter uma dependência cíclica, independentemente da ordem em que você itera ...L−T
fonte
Se você sabe que a matriz tem uma inversa (isto é, se é de fato positiva definida) e se não é muito grande, a decomposição de Cholesky fornece um meio apropriado para caracterizar a inversa de uma matriz.
fonte