Motivação : estou escrevendo um estimador de estado no MATLAB (o filtro Kalman sem cheiro), que exige a atualização da raiz quadrada (triangular superior) de uma matriz de covariância a cada iteração (ou seja, para uma matriz de covariância , é verdade que ). Para que eu possa executar os cálculos necessários, preciso fazer uma Atualização e Downdate Rank-1 de Cholesky usando a função do MATLAB .P P = S S Tcholupdate
Problema : Infelizmente, durante o curso das iterações, essa matriz às vezes pode perder uma definição positiva. O downdate de Cholesky falha em matrizes não PD.
Minha pergunta é : existem formas simples e confiáveis no MATLAB de tornar positivo-definido?
( ou, mais geralmente, existe uma boa maneira de tornar positiva qualquer matriz covariância positiva ) ?
Notas :
- é classificação completa
- Eu tentei a abordagem eigendecomposition (que não funcionou). Isso basicamente envolveu encontrar , definir todos os elementos negativos de e reconstruir um novo que são matrizes apenas com elementos positivos. V , D = 1 × 10 - 8 S ′ = V ′ D ′ V ′ T V ′ , D ′
- Estou ciente da abordagem de Higham (que é implementada em R as
nearpd
), mas parece projetar apenas a matriz PSD mais próxima. Eu preciso de uma matriz PD para a atualização Cholesky.
fonte
Respostas:
Aqui está o código que eu usei no passado (usando a abordagem SVD). Sei que você disse que já tentou, mas sempre funcionou para mim, então pensei em publicá-lo para ver se era útil.
fonte
[V,D] = eig(A); D(D <= 1e-10) = 1e-6; Apd = V*A*V';
. Essa abordagem é semelhante à de Rebonato e Jackel, e parece falhar em casos patológicos como o meu.em Matlab:
eu recebo
fonte
cholupdate
mas minha pergunta é sobre como tornarR
(neste caso) positivo definitivo. Eu tenho um caso em que meuR
é não-pd echolupdate(R,X,'-')
(um downdate) falha.cholupdate
falhar, recalcular a covariância com base nesse buffer circular e reduzir o custo. Se você possui memória e pode suportar o tempo ocasional de acerto quando isso acontece, não encontrará um método melhor em termos de precisão e facilidade de implementação.Uma maneira alternativa de calcular a fatoração de Cholesky é fixando os elementos diagonais de S em 1 e, em seguida, introduzindo uma matriz diagonal D, com elementos positivos.
Isso evita a necessidade de criar raízes quadradas ao realizar os cálculos, o que pode causar problemas ao lidar com números "pequenos" (ou seja, números pequenos o suficiente para que o arredondamento que ocorre devido a operações de ponto flutuante seja importante). A página da wikipedia tem a aparência desse algoritmo ajustado.
Então, em vez de você obtém com P = R D R T S = R D 1P=SST P=RDRT S=RD12
Espero que isto ajude!
fonte
Efetivamente, a fatoração de Cholesky pode falhar quando sua matriz não é "realmente" positivamente definida. Aparecem dois casos, ou você tem um valor de eingen negativo ou seu menor valor de eingen é positivo, mas próximo de zero. O segundo caso deve teoricamente dar uma solução, mas numericamente difícil. Se tiver apenas intuitivo, adicione uma pequena constante à diagonal da minha matriz para resolver o problema. Mas esse caminho não é rigoroso porque modifica um pouco a solução. Se você precisar calcular uma solução de alta precisão, tente algumas pesquisas sobre a fatoração de Cholesky modificada.
fonte
Se você tentar estimar com P não positivo positivo, está solicitando problemas e algoritmos de desafio, evite esta situação. Se o seu problema for numérico: P é definitivo positivo, mas o autovalor numérico é muito pequeno - tente uma nova ameaça para os seus estados. Espero que o conselho não seja tarde demais Atenciosamente, Zeev
fonte