Motivation : j'écris un estimateur d'état dans MATLAB (le filtre de Kalman non parfumé), qui appelle à la mise à jour de la racine carrée (triangulaire supérieure) d'une matrice de covariance à chaque itération (c'est-à-dire pour une matrice de covariance , il est vrai que ). Pour que je puisse effectuer les calculs requis, je dois faire une mise à jour et une mise à jour Cholesky de rang 1 à l'aide de la fonction MATLAB .cholupdate
Problème : Malheureusement, au cours des itérations, cette matrice peut parfois perdre en précision positive. La mise à jour de Cholesky échoue sur les matrices non PD.
Ma question est : existe-t-il des moyens simples et fiables dans MATLAB pour rendre positif-défini?
( ou plus généralement, existe-t-il un bon moyen de rendre positive une matrice de covariance donnée ? )
Remarques :
- est le rang complet
- J'ai essayé l'approche eigendecomposition (qui n'a pas fonctionné). Cela impliquait essentiellement de trouver , de définir tous les éléments négatifs de , et de reconstruire un nouveau où sont des matrices avec uniquement des éléments positifs.
- Je connais l'approche Higham (qui est implémentée dans R as
nearpd
), mais elle ne semble se projeter que vers la matrice PSD la plus proche. J'ai besoin d'une matrice PD pour la mise à jour Cholesky.
la source
Réponses:
Voici le code que j'ai utilisé dans le passé (en utilisant l'approche SVD). Je sais que vous avez dit que vous l'aviez déjà essayé, mais cela a toujours fonctionné pour moi, donc j'ai pensé le poster pour voir si c'était utile.
la source
[V,D] = eig(A); D(D <= 1e-10) = 1e-6; Apd = V*A*V';
. Cette approche est similaire à celle de Rebonato et Jackel, et elle semble échouer pour des cas pathologiques comme le mien.dans Matlab:
Je reçois
la source
cholupdate
mais ma question est de rendreR
(dans ce cas) définitif positif. J'ai un cas où monR
est non-pd etcholupdate(R,X,'-')
(une mise à jour) échoue.cholupdate
échec, de recalculer la covariance sur la base de ce tampon circulaire et d'en manger le coût. Si vous avez la mémoire et que vous pouvez supporter le temps occasionnel lorsque cela se produit, vous ne trouverez pas de meilleure méthode en termes de précision et de facilité de mise en œuvre.Une autre façon de calculer la factorisation de Cholesky consiste à fixer les éléments diagonaux de S à 1, puis à introduire une matrice diagonale D, avec des éléments positifs.
Cela évite d'avoir à prendre des racines carrées lors des calculs, ce qui peut poser des problèmes lors du traitement de "petits" nombres (c'est-à-dire des nombres suffisamment petits pour que l'arrondi qui se produit en raison des opérations en virgule flottante soit important). La page wikipedia a à quoi ressemble cet algorithme ajusté.
Donc au lieu deP= SST vous obtenez P= R DRT avec S= Rré12
J'espère que cela t'aides!
la source
En effet, la factorisation de Cholesky peut échouer lorsque votre matrice n'est pas "vraiment" positive définie. Deux cas apparaissent, ou vous avez une valeur eingen négative, ou votre plus petite valeur eingen est positive, mais proche de zéro. Le second cas doit théoriquement donner une solution, mais numériquement difficile. Si j'ai juste intuitif, ajoutez une petite constante à la diagonale de ma matrice pour résoudre le problème. Mais cette voie n'est pas rigoureuse car elle modifie légèrement la solution. Si vous devez calculer une solution de très haute précision, essayez des recherches sur la factorisation de Cholesky modifiée.
la source
Si vous essayez d'estimer avec P non positif défini que vous demandez des problèmes et des algorithmes de défi, vous devriez éviter cette situation. Si votre problème est numérique: P est défini positif mais les valeurs propres numériques sont trop petites - essayez un nouveau scalling pour vos états Si votre problème est en effet non positif défini - essayez différents ensembles de variables d'état. J'espère que le conseil n'est pas trop tard Cordialement, Zeev
la source