Dans un projet logiciel sur lequel je travaille, certains calculs sont beaucoup plus faciles pour les matrices denses de bas rang. Certaines instances problématiques impliquent des matrices denses de bas rang, mais elles me sont données dans leur intégralité, plutôt que comme des facteurs, donc je vais devoir vérifier le rang et factoriser la matrice si je veux profiter de la structure de bas rang .
Les matrices en question sont généralement entièrement ou presque entièrement denses, avec n allant de cent à quelques milliers. Si une matrice a un rang bas (disons moins de 5 à 10), alors le calcul de la SVD et son utilisation forment une factorisation de bas rang en vaut la chandelle. Cependant, si la matrice n'est pas de bas rang, alors l'effort serait gaspillé.
J'aimerais donc trouver un moyen rapide et raisonnablement fiable de déterminer si le rang est bas ou non avant d'investir l'effort de faire une factorisation SVD complète. Si à un moment donné, il devient clair que le rang est supérieur au seuil, le processus peut s'arrêter immédiatement. Si la procédure déclare par erreur que la matrice est de bas rang alors qu'elle ne l'est pas, ce n'est pas un gros problème, car je ferais toujours une SVD complète pour confirmer le bas rang et trouver une factorisation de bas rang.
Les options que j'ai envisagées incluent une factorisation LU ou QR révélatrice de rang suivie d'une SVD complète comme vérification. Y a-t-il d'autres approches que je devrais envisager?
la source
Le problème, bien sûr, est que le calcul du vrai rang (par exemple, via une décomposition QR) n'est pas vraiment moins cher que le calcul d'une représentation de bas rang de la matrice.
Le mieux que vous puissiez faire est probablement d'utiliser un algorithme aléatoire pour trouver des approximations de bas rang. Ceux-ci peuvent, au moins en théorie, être beaucoup plus rapides que de travailler sur la matrice entière car, en substance, ils ne calculent que les décompositions pour les projections de la matrice sur des sous-espaces aléatoires.
Que cela en vaille la peine pour une matrice de taille peut être une bonne question, mais si vos problèmes deviennent vraiment importants, je soupçonne que cela en vaut la peine .100×100
la source
Une autre approche qui mérite d'être essayée consiste à utiliser l'Approximation croisée adaptative (ACA). Il s'agit d'un algorithme assez populaire qui propose de nombreuses implémentations en ligne. Pour la référence, vous pouvez voir le papier original:
L'ACA et ses variations (disons ACA +, hybridation croisée HCA) peuvent être utilisés dans différents scénarios. Vous, ayant déjà calculé toute la matrice dense, est l'un des avantages, car vous pourrez calculer les résidus exactement si nécessaire.
la source
la source