Corrélations étranges dans les résultats SVD de données aléatoires; ont-ils une explication mathématique ou est-ce un bug LAPACK?

21

J'observe un comportement très étrange dans le résultat SVD de données aléatoires, que je peux reproduire à la fois dans Matlab et R. Il ressemble à un problème numérique dans la bibliothèque LAPACK; est-ce?

Je tire n=1000 échantillons de la gaussienne k=2 dimensionnelle avec une moyenne nulle et une covariance d'identité: XN(0,I) . Je les assemble dans une matrice de données X . (Je peux éventuellement centrer X ou non, cela n'influence pas ce qui suit.) Ensuite, j'effectue une décomposition en valeurs singulières (SVD) pour obtenir X = U S V . Prenons deux éléments particuliers de U , par exemple U 11 et U1000×2XXX=USVUU11U22 , et demandez quelle est la corrélation entre les entredifférents tirages deX . Je m'attendrais à ce que si le nombreNrep de tirages soit raisonnablement grand, alors toutes ces corrélations devraient être autour de zéro (c'est-à-dire que les corrélations de population devraient être nulles, et les corrélations d'échantillon seraient petites).

Cependant, j'observe des corrélations étrangement fortes (autour de ±0.2 ) entre U11 , U12 , U21 et , et uniquement entre ces éléments. Toutes les autres paires d'éléments ont des corrélations autour de zéro, comme prévu. Voici à quoi ressemble la matrice de corrélation pour les éléments "supérieurs" de ( premiers éléments de la première colonne, puis les premiers éléments de la deuxième colonne):U22U 10 1020U1010

Corrélations étranges SVD

Remarquez des valeurs étrangement élevées dans les coins supérieurs gauches de chaque quadrant.

C'est ce commentaire de @ whuber qui a attiré mon attention sur cet effet. @whuber a fait valoir que les PC1 et PC2 ne sont pas indépendants et a présenté cette forte corrélation comme preuve de cela. Cependant, j'ai l'impression qu'il a accidentellement découvert un bogue numérique dans la bibliothèque LAPACK. Qu'est-ce qui se passe ici?

Voici le code R de @ whuber:

stat <- function(x) {u <- svd(x)$u; c(u[1,1], u[2, 2])};
Sigma <- matrix(c(1,0,0,1), 2);
sim <- t(replicate(1e3, stat(MASS::mvrnorm(10, c(0,0), Sigma))));
cor.test(sim[,1], sim[,2]);

Voici mon code Matlab:

clear all
rng(7)

n = 1000;     %// Number of variables
k = 2;        %// Number of observations
Nrep = 1000;  %// Number of iterations (draws)

for rep = 1:Nrep
    X = randn(n,k);
    %// X = bsxfun(@minus, X, mean(X));
    [U,S,V] = svd(X,0);

    t(rep,:) = [U(1:10,1)' U(1:10,2)'];
end

figure
imagesc(corr(t), [-.5 .5])
axis square
hold on
plot(xlim, [10.5 10.5], 'k')
plot([10.5 10.5], ylim, 'k')
amibe dit réintégrer Monica
la source
Si vous utilisez n = 4 et k = 3, vous verrez également les corrélations.
Aksakal
@Aksakal: oui, en effet, merci. J'ai modifié pour supprimer la différence revendiquée entre k = 2 et k = 3.
Amoeba dit Reinstate Monica

Réponses:

23

Ce n'est pas un bug.

Comme nous l'avons exploré (en détail) dans les commentaires, deux choses se produisent. La première est que les colonnes de U sont contraintes pour répondre aux exigences SVD: chacune doit avoir une longueur unitaire et être orthogonale à toutes les autres. Affichage d'un U comme une variable aléatoire créée à partir d' une matrice aléatoire X via un algorithme de SVD particulier, nous notons donc que ces k(k+1)/2 contraintes fonctionnellement indépendantes créer des dépendances statistiques entre les colonnes de U .

Ces dépendances pourraient être révélées plus ou moins en étudiant les corrélations entre les composantes de U , mais un deuxième phénomène émerge : la solution SVD n'est pas unique. Au minimum, chaque colonne de U peut être négativement indépendante, donnant au moins 2k solutions distinctes avec k colonnes. De fortes corrélations (excédant 1/2 ) peut être induite en changeant les signes des colonnes de manière appropriée. (Une façon de le faire est donnée dans mon premier commentaire à la réponse d'Amoeba dans ce fil: je force tous les uii,i=1,,k pour avoir le même signe, les rendant tous négatifs ou tous positifs avec une probabilité égale.) En revanche, toutes les corrélations peuvent être faites pour disparaître en choisissant les signes au hasard, indépendamment, avec des probabilités égales. (Je donne un exemple ci-dessous dans la section "Modifier".)

Avec des soins, nous pouvons discerner partiellement ces deux phénomènes lors de la lecture des matrices de diagramme de dispersion des composants de U . Certaines caractéristiques - telles que l'apparition de points répartis de manière presque uniforme dans des régions circulaires bien définies - démentent un manque d'indépendance. D'autres, tels que les diagrammes de dispersion montrant des corrélations claires non nulles, dépendent évidemment des choix effectués dans l'algorithme - mais de tels choix ne sont possibles qu'en raison du manque d'indépendance en premier lieu.

Le test ultime d'un algorithme de décomposition comme SVD (ou Cholesky, LR, LU, etc.) est de savoir s'il fait ce qu'il prétend. Dans ce cas, il suffit de vérifier que lorsque SVD renvoie le triple des matrices (U,D,V) , que X est récupéré, jusqu'à l'erreur en virgule flottante anticipée, par le produit UDV ; que les colonnes de U et de V sont orthonormées; et que D est diagonal, ses éléments diagonaux sont non négatifs et sont disposés en ordre décroissant. J'ai appliqué de tels tests à l' svdalgorithme dansRet je ne l'ai jamais trouvé erroné. Bien que ce ne soit pas une assurance qu'il est parfaitement correct, une telle expérience - qui, je crois, est partagée par un grand nombre de personnes - suggère que tout bogue nécessiterait une sorte d'entrée extraordinaire pour être manifeste.

Ce qui suit est une analyse plus détaillée des points spécifiques soulevés dans la question.


En utilisant Rla svdprocédure de, vous pouvez d'abord vérifier qu'à mesure que k augmente, les corrélations entre les coefficients de U s'affaiblissent, mais elles sont toujours non nulles. Si vous deviez simplement effectuer une simulation plus large, vous constateriez qu'ils sont importants. (Lorsque k=3 , 50000 itérations devraient suffire.) Contrairement à l'affirmation de la question, les corrélations ne "disparaissent pas complètement".

Deuxièmement, une meilleure façon d'étudier ce phénomène est de revenir à la question fondamentale de l' indépendance des coefficients. Bien que les corrélations tendent à être proches de zéro dans la plupart des cas, le manque d'indépendance est clairement évident. Ceci est rendu plus évident en étudiant la distribution à plusieurs variables complète des coefficients de U . La nature de la distribution émerge même dans de petites simulations dans lesquelles les corrélations non nulles ne peuvent pas (encore) être détectées. Par exemple, examinez une matrice de nuage de points des coefficients. Pour rendre cela possible, j'ai défini la taille de chaque jeu de données simulé à 4 et j'ai gardé k=2 , dessinant ainsi 1000réalisations de la matrice 4×2U , créant une matrice 1000×8 . Voici sa matrice de nuage de points complète, avec les variables répertoriées par leur position dans U :

Figure

Le fait de parcourir la première colonne révèle un manque d'indépendance intéressant entre u11 et les autres ujej : regardez par exemple comment le quadrant supérieur du nuage de points avec u21 est presque vide; ou examiner le nuage elliptique incliné vers le haut décrivant la relation (u11,u22) et le nuage incliné vers le bas pour la paire (u21,u12) . Un examen attentif révèle un manque d'indépendance évident entre presque tous ces coefficients: très peu d'entre eux semblent indépendants à distance, même si la plupart d'entre eux présentent une corrélation proche de zéro.

(NB: la plupart des nuages ​​circulaires sont des projections d'une hypersphère créée par la condition de normalisation forçant la somme des carrés de tous les composants de chaque colonne à l'unité.)

Les matrices de nuages ​​de points avec k=3 et k=4 présentent des schémas similaires: ces phénomènes ne se limitent pas à k=2 , ni ne dépendent de la taille de chaque jeu de données simulé: ils deviennent plus difficiles à générer et à examiner.

Les explications de ces modèles vont à l'algorithme utilisé pour obtenir U dans la décomposition en valeurs singulières, mais nous savons que de tels modèles de non-indépendance doivent exister par les propriétés très définissantes de U : puisque chaque colonne successive est (géométriquement) orthogonale à la précédente celles-ci, ces conditions d'orthogonalité imposent des dépendances fonctionnelles parmi les coefficients, ce qui se traduit par des dépendances statistiques parmi les variables aléatoires correspondantes.


Éditer

En réponse aux commentaires, il peut être intéressant de noter dans quelle mesure ces phénomènes de dépendance reflètent l'algorithme sous-jacent (pour calculer une SVD) et dans quelle mesure ils sont inhérents à la nature du processus.

Les modèles spécifiques de corrélations entre les coefficients dépendent beaucoup des choix arbitraires faits par l'algorithme SVD, car la solution n'est pas unique: les colonnes de U peuvent toujours être indépendamment multipliées par -1 ou 1 . Il n'y a aucun moyen intrinsèque de choisir le signe. Ainsi, lorsque deux algorithmes SVD font des choix de signe différents (arbitraires ou peut-être même aléatoires), ils peuvent entraîner des motifs différents de diagrammes de dispersion des valeurs (ujej,ujej) . Si vous souhaitez voir cela, remplacez la statfonction dans le code ci-dessous par

stat <- function(x) {
  i <- sample.int(dim(x)[1]) # Make a random permutation of the rows of x
  u <- svd(x[i, ])$u         # Perform SVD
  as.vector(u[order(i), ])   # Unpermute the rows of u
}

Ce premier réordonne au hasard les observations x, effectue la SVD, puis applique l'ordre inverse à upour correspondre à la séquence d'observation d'origine. Comme l'effet est de former des mélanges de versions réfléchies et tournées des diagrammes de dispersion d'origine, les diagrammes de dispersion dans la matrice seront beaucoup plus uniformes. Toutes les corrélations de l'échantillon seront extrêmement proches de zéro (par construction: les corrélations sous-jacentes sont exactement nulles). Néanmoins, le manque d'indépendance restera évident (dans les formes circulaires uniformes qui apparaissent, notamment entre uje,j et uje,j ).

Le manque de données dans certains quadrants de certains des diagrammes de dispersion d'origine (illustrés dans la figure ci-dessus) provient de la façon dont l' Ralgorithme SVD sélectionne les signes pour les colonnes.

Rien ne change dans les conclusions. Parce que la deuxième colonne de U est orthogonale à la première, elle (considérée comme une variable aléatoire multivariée) dépend de la première (également considérée comme une variable aléatoire multivariée). Vous ne pouvez pas avoir tous les composants d'une colonne indépendants de tous les composants de l'autre; tout ce que vous pouvez faire est de regarder les données de manière à masquer les dépendances - mais la dépendance persistera.


Voici un Rcode mis à jour pour gérer les cas k>2 et dessiner une partie de la matrice de nuage de points.

k <- 2    # Number of variables
p <- 4    # Number of observations
n <- 1e3  # Number of iterations
stat <- function(x) as.vector(svd(x)$u)
Sigma <- diag(1, k, k); Mu <- rep(0, k)
set.seed(17)
sim <- t(replicate(n, stat(MASS::mvrnorm(p, Mu, Sigma))))
colnames(sim) <- as.vector(outer(1:p, 1:k, function(i,j) paste0(i,",",j)))
pairs(sim[, 1:min(11, p*k)], pch=".")
whuber
la source
3
La corrélation se produit entre les premiers composants des colonnes de car c'est ainsi que fonctionne l'algorithme SVD. Que les rangées de X soient gaussiennes est sans importance: je suis sûr que vous avez remarqué que les coefficients de U ne sont pas gaussiens. UXU
whuber
2
Au fait, je viens de découvrir que le simple fait de remplacer svd(X,0)par svds(X)dans mon code Matlab fait disparaître l'effet! Pour autant que je sache, ces deux fonctions utilisent des algorithmes SVD différents (les deux sont des routines LAPACK, mais apparemment différentes). Je ne sais pas si R a une fonction similaire à celle de Matlab svds, mais je me demande si vous allez toujours maintenir que c'est un "vrai" effet et non un problème numérique.
Amoeba dit Reinstate Monica
4
Messieurs, attendez une minute. Pourquoi ne parlez-vous pas du signe? Le signe d'un vecteur propre est fondamentalement arbitraire. Mais le programme de svd ne l'assigne pas au hasard, le signe dépend de l'implémentation de svd et des données. Si, après l'extraction, Uvous décidez au hasard si chacune de ses colonnes doit rester telle quelle ou si elle doit changer son signe, les corrélations dont vous parlez ne disparaîtront-elles pas?
ttnphns du
2
@ttnphns C'est correct, comme expliqué dans ma modification. Bien que cela fasse disparaître les corrélations, les dépendances entre les colonnes de ne disparaissent pas pour autant. (La version améliorée de I fournie équivaut à changer aléatoirement les signes des colonnes.)Ustat
whuber
2
Un point mineur (à ce grand fil!) Le SVD ne nécessite pas que les éléments dans la diagonale de Ssoient dans un ordre particulier; c'est une question de commodité. D'autres routines le garantissent (par exemple MATLAB svds) mais ce n'est pas une exigence générale. @amoeba: En regardant svds(qui semble exempt de ce comportement problématique) le calcul est basé sur le calcul des valeurs propres en premier (donc il n'utilise pas les routines standard dgesdd/ dgesvdLAPACK - je soupçonne fortement qu'il utilise dsyevr/ dsyevxau premier abord).
usεr11852 dit Réintégrer Monic le
11

Cette réponse présente une réplication des résultats de @ whuber dans Matlab, ainsi qu'une démonstration directe que les corrélations sont un "artefact" de la façon dont l'implémentation SVD choisit de signer pour les composants.

Compte tenu de la longue chaîne de commentaires potentiellement déroutants, je tiens à souligner pour les futurs lecteurs que je suis entièrement d'accord avec ce qui suit:

  1. Dans le contexte de cette discussion, est certainement une variable aléatoire.U
  2. Les colonnes de doivent être de longueur 1 . Cela signifie que les éléments à l'intérieur de chaque colonne ne sont pas indépendants; leurs carrés totalisent un. Cependant, cela n'implique aucune corrélation entre U i 1 et U j 1 pour i j , et la corrélation d'échantillon doit être minuscule pour un grand nombre N r e p de tirages aléatoires.U1Uje1Uj1jejNrep
  3. Les colonnes de doivent être orthogonales. Cela signifie que les éléments de différentes colonnes ne sont pas indépendants; leur produit scalaire est nul. Encore une fois, cela n'implique aucune corrélation entre U i 1 et U j 2 , et la corrélation de l'échantillon devrait être minime.UUje1Uj2

Ma question était: pourquoi voyons-nous des corrélations élevées de même pour un grand nombre de tirages aléatoires N r e p = 1000 ?0,2Nrep=1000

Voici une réplication de l'exemple de @ whuber avec , k = 2 et N r e p = 1000 dans Matlab:n=4k=2Nrep=1000

SVD

À gauche se trouve la matrice de corrélation, à droite - des diagrammes de dispersion similaires à ceux de @ whuber. L'accord entre nos simulations semble parfait.

Maintenant, suite à une suggestion ingénieuse de @ttnphns, j'attribue des signes aléatoires aux colonnes de , c'est-à-dire après cette ligne:U

[U,S,V] = svd(X,0);

J'ajoute les deux lignes suivantes:

U(:,1) = U(:,1) * sign(randn(1));
U(:,2) = U(:,2) * sign(randn(1));

Voici le résultat:

SVD avec des signes aléatoires

Toutes les corrélations disparaissent, exactement comme je m'y attendais depuis le début !

11

UU

PS. Félicitations à @whuber pour avoir dépassé la réputation de 100k aujourd'hui!

amibe dit réintégrer Monica
la source
statstat <- function(x) { u <- svd(x)$u; as.vector(sign(runif(1) - 1/2)*u %*% diag(sign(diag(u)))) }U(u11,u22,,ukk)UU
svdssvdUU
R±2/30,2
1
U
1
Intuitivement, c'est juste. Dès que le premier axe principal est défini dans l'espace, le reste pr. les axes obtiennent une liberté réduite. En cas de données 2D, le deuxième (dernier) PC est entièrement lié, à l'exception du signe. Je préfère l'appeler contrainte, pas dépendance au sens statistique.
ttnphns
0

Xy

X2+y2=1

Cov[X,y]=Vuner[Xy]=E[X2y2]-E[Xy]2

Xy

Aksakal
la source
k(k+1)/2UUUUk(k-1)/2
U1Unkn>kUnn=1000n=4X2+y2=1U
xUyx2+y2=1Cov(x,y)=0x=cos(θ)y=sin(θ)θ[0,2π)
UUij01/nnn1/n=1
1
UXU11U21ρnρρρ=0
amibe dit Réintégrer Monica le