Motivación : estoy escribiendo un estimador de estado en MATLAB (el filtro de Kalman sin perfume), que requiere la actualización de la raíz cuadrada (triangular superior) de una matriz de covarianza en cada iteración (es decir, para una matriz de covarianza , es cierto que ). Para poder realizar los cálculos necesarios, necesito hacer una actualización y una actualización de Cholesky de rango 1 usando la función de MATLAB .P = S S Tcholupdate
Problema : Desafortunadamente, durante el curso de las iteraciones, esta matriz veces puede perder definición positiva. La actualización de Cholesky falla en matrices que no son PD.
Mi pregunta es : ¿hay alguna manera simple y confiable en MATLAB para hacer que definitivo?
( o más en general, ¿hay una buena manera de hacer que una matriz de covarianza positiva-definida? )
Notas :
- es rango completo
- He intentado el enfoque de descomposición propia (que no funcionó). Básicamente, esto implicaba encontrar , establecer todos los elementos negativos de , y reconstruir un nuevo donde son matrices con solo elementos positivos. V , D = 1 × 10 - 8 S ′ = V ′ D ′ V ′ T V ′ , D ′
- Soy consciente del enfoque de Higham (que se implementa en R como
nearpd
), pero parece que solo se proyecta a la matriz PSD más cercana. Necesito una matriz PD para la actualización de Cholesky.
fuente
Respuestas:
Aquí está el código que he usado en el pasado (usando el enfoque SVD). Sé que dijiste que ya lo has probado, pero siempre me ha funcionado, así que pensé en publicarlo para ver si era útil.
fuente
[V,D] = eig(A); D(D <= 1e-10) = 1e-6; Apd = V*A*V';
. Este enfoque es similar al de Rebonato y Jackel, y parece fallar en casos patológicos como el mío.en Matlab:
yo obtengo
fuente
cholupdate
pero mi pregunta es sobre hacerR
(en este caso) positivo definitivo. Tengo un caso en el que miR
no es pd ycholupdate(R,X,'-')
(una fecha de actualización) falla.cholupdate
falle, volver a calcular la covarianza en función de ese búfer circular y reducir el costo. Si tiene memoria y puede soportar el golpe de tiempo ocasional cuando esto sucede, no encontrará un mejor método en términos de precisión y facilidad de implementación.Una forma alternativa de calcular la factorización de Cholesky es fijando los elementos diagonales de S a 1, y luego introduciendo una matriz diagonal D, con elementos positivos.
Esto evita la necesidad de tomar raíces cuadradas al hacer los cálculos, lo que puede causar problemas al tratar con números "pequeños" (es decir, números lo suficientemente pequeños como para que el redondeo que se produce debido a operaciones de punto flotante sea importante). La página de wikipedia tiene el aspecto de este algoritmo ajustado.
Entonces, en lugar de , obtienes con P = R D R T S = R D 1P=SST P=RDRT S=RD12
¡Espero que esto ayude!
fuente
Efectivamente, la factorización de Cholesky puede fallar cuando su matriz no es "realmente" positiva. Aparecen dos casos, o tiene un valor de eingen negativo, o su valor de eingen más pequeño es positivo, pero cercano a cero. El segundo caso debe dar una solución teórica, pero numéricamente difícil. Si tiene solo intuitiva, agregue una pequeña constante a la diagonal de mi matriz para resolver el problema. Pero de esta manera no es riguroso porque modifica ligeramente la solución. Si debe calcular una solución de alta precisión, intente investigar sobre la factorización de Cholesky modificada.
fuente
Si intenta estimar con P no positivo definido, está solicitando problemas y algoritmos desafiantes, debe evitar esta situación. Si su problema es numérico: P es positivo definido pero el valor propio numérico es demasiado pequeño - intente una nueva escala para sus estados Si su problema es realmente no positivo definido - intente diferentes conjuntos de variables de estado. Espero que el consejo no sea demasiado tarde Saludos, Zeev
fuente