Déterminer rapidement si une matrice dense est de bas rang ou non

13

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?

Brian Borchers
la source

Réponses:

8

Il y a une astuce intéressante que j'ai récemment apprise de cet article . Vous commencez à faire un QR révélateur de rang et vous vous arrêtez après les premières réflexions des ménage, lorsque vous avez une matrice de la forme avec triangulaire de taille , et typiquement non triangulaire (puisque nous nous sommes arrêtés après les premières itérations de notre boucle principale). À ce stade, vous vérifiez si : s'il est valide, alors est à distance au plus d'une matrice de rangk

[R1R120R22],
R1k×kR22kR22εAεk; sinon, il ne devrait pas l'être (sauf erreurs numériques).

Cette procédure coûte pour une matrice dense .O(n2k)n×n

Federico Poloni
la source
C'est essentiellement l'approche que j'ai décrite dans la question. Je pense que la réponse proposée par Wolfgang Bangerth pourrait faire mieux que . O(n2k)
Brian Borchers
7

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

Wolfgang Bangerth
la source
D'après ce que je sais de ces algorithmes, ils produisent une matrice de bas rang qui est raisonnablement proche en norme de la matrice donnée. J'ai besoin de savoir s'il y a (par exemple) une matrice de rang 10 ou moins qui est très proche de la matrice donnée (disons une erreur relative de 1.0e-10 ou mieux.)
Brian Borchers
Oui, mais vous pouvez également faire une décomposition QR de la matrice projetée (de faible dimension) et si cette décomposition révèle un manque de rang complet, vous aurez également une matrice d'origine déficiente en rang. N'était-ce pas le critère dont vous aviez besoin pour faire une décomposition QR sur la matrice d'origine?
Wolfgang Bangerth
Je peux voir que le rang de la matrice projetée est inférieur ou égal à (le nombre de lignes dans la matrice aléatoire je multiplie par A) et le rang de A. S'il est de rang k , alors la matrice d'origine ne peut pas être de rang k - 1 ou moins. S'il est de rang inférieur à k, j'aurais pu être malchanceux ou A était de rang inférieur à k . Trouver le rang de la matrice k par n peut être fait en temps O ( k 2 n ) . Cependant, si la matrice aléatoire que je multiplie fois A est dense, la multiplication prend Okkk1kAkknO(k2n)A temps. Existe-t-il des matrices clairsemées qui préservent le rang avec une forte probabilité? O(kn2)
Brian Borchers
Je ne sais pas. Je suis d'accord (et supposé impliquer) que l'algorithme ne peut vous dire que si une matrice n'est pas de plein rang. Il ne peut pas vous dire si la matrice est de rang complet sauf si vous prenez toutes les directions aléatoires . J'espère simplement que vous obtiendrez une réponse pour k suffisamment petit où k n 2n 3 . k=nkkn2n3
Wolfgang Bangerth
1

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.

O(Nr)Nr(ϵ)rϵO(N2r)

Anton Menshov
la source
0

A0xAxAATA

(ATA)A

from scipy.sparse.linalg import svds
sing = svds( A, k=20, tol=1e-4, return_singular_vectors=False )  # v0=random
# runtimes on random-normal n x n:
# n = 100, 1k, 2k
#       5, 130, 770 ms
denis
la source