Strane correlazioni nei risultati SVD di dati casuali; hanno una spiegazione matematica o è un bug LAPACK?


21

Osservo un comportamento molto strano nel risultato SVD di dati casuali, che posso riprodurre sia in Matlab che in R. Sembra un problema numerico nella libreria LAPACK; è?

Traccio n=1000 campioni dal k=2 gaussiano dimensionale con zero covarianza di identità e media: XN(0,I) . Li assemblo in una matrice di dati X . (Opzionalmente posso centrare X o no, non influenza quanto segue.) Quindi eseguo la decomposizione a valore singolare (SVD) per ottenere X = U S V . Prendiamo alcuni due elementi particolari di U , ad esempio U 11 e U1000×2XXX=USVUU11U22 , e chiedere qual è la correlazione tra loro attraverso diversi pareggi diX . Mi aspetterei che se il numeroNrep di pareggi è abbastanza grande, quindi tutte queste correlazioni dovrebbero essere intorno allo zero (vale a dire correlazioni popolazione dovrebbe essere pari a zero, e le correlazioni campione sarà piccola).

Tuttavia, osservo alcune correlazioni stranamente forti (circa ±0.2 ) tra U11 , U12 , U21 e U22 , e solo tra questi elementi. Tutte le altre coppie di elementi hanno correlazioni intorno allo zero, come previsto. Ecco come appare la matrice di correlazione per i 20 elementi "superiori" di U (primi 10 elementi della prima colonna, quindi i primi 10 elementi della seconda colonna):

SVD correlazioni strane

Notare valori stranamente alti negli angoli in alto a sinistra di ciascun quadrante.

È stato il commento di questo @ whuber che ha portato questo effetto alla mia attenzione. @whuber ha sostenuto che PC1 e PC2 non sono indipendenti e ha presentato questa forte correlazione come prova di ciò. Tuttavia, la mia impressione è che abbia scoperto per errore un bug numerico nella libreria LAPACK. Cosa sta succedendo qui?

Ecco il codice R di @ 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]);

Ecco il mio codice 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')

Se usi n = 4 e k = 3, vedrai anche le correlazioni.
Aksakal,

@Aksakal: sì, davvero, grazie. Ho modificato per rimuovere la differenza richiesta tra k = 2 e k = 3.
ameba dice di reintegrare Monica il

Risposte:


23

Questo non è un bug.

Come abbiamo esplorato (ampiamente) nei commenti, stanno accadendo due cose. Il primo è che le colonne di U sono vincolate per soddisfare i requisiti SVD: ognuna deve avere una lunghezza unitaria ed essere ortogonale a tutte le altre. Visualizzazione di U come variabile casuale creato da una matrice casuale X tramite un particolare algoritmo SVD, abbiamo quindi notare che questi k(k+1)/2 vincoli funzionalmente indipendenti creare dipendenze statistiche tra le colonne di U .

Queste dipendenze potrebbero essere rivelate in misura maggiore o minore studiando le correlazioni tra i componenti di U , ma emerge un secondo fenomeno : la soluzione SVD non è unica. Come minimo, ogni colonna di U può essere negata indipendentemente, dando almeno 2k soluzioni distinte con k colonne. Forti correlazioni (superiore a 1/2 ) può essere indotta cambiando i segni delle colonne opportunamente. (Un modo per fare questo è dato in mio primo commento alla risposta di Amoeba in questa discussione: forzo tutti i uii,i=1,,k per avere lo stesso segno, rendendoli tutti negativi o tutti positivi con uguale probabilità.) D'altra parte, tutte le correlazioni possono essere fatte svanire scegliendo i segni in modo casuale, indipendente, con pari probabilità. (Faccio un esempio di seguito nella sezione "Modifica".)

Con cura, possiamo distinguere parzialmente entrambi questi fenomeni durante la lettura matrici dispersione dei componenti U . Alcune caratteristiche - come l'apparizione di punti distribuiti in modo quasi uniforme all'interno di regioni circolari ben definite - credono in una mancanza di indipendenza. Altri, come i grafici a dispersione che mostrano chiare correlazioni diverse da zero, dipendono ovviamente dalle scelte fatte nell'algoritmo, ma tali scelte sono possibili solo a causa della mancanza di indipendenza in primo luogo.

Il test finale di un algoritmo di decomposizione come SVD (o Cholesky, LR, LU, ecc.) È se fa ciò che afferma. In questa circostanza è sufficiente verificare che quando SVD restituisce il triplo delle matrici (U,D,V) , X viene recuperato, fino all'errore di virgola mobile previsto, dal prodotto UDV ; che le colonne diU e diV sono ortonormali; e cheD è diagonale, i suoi elementi diagonali sono non negativi e sono disposti in ordine decrescente. Ho applicato tali testsvdall'algoritmo inRe non ho mai trovato un errore. Sebbene ciò non sia certo, è perfettamente corretto, tale esperienza - che credo sia condivisa da moltissime persone - suggerisce che qualsiasi errore richiederebbe un tipo straordinario di input per essere manifestato.

Quella che segue è un'analisi più dettagliata dei punti specifici sollevati nella domanda.


Usando Rla svdprocedura, per prima cosa puoi verificare che all'aumentare di k , le correlazioni tra i coefficienti di U si indeboliscono, ma sono comunque diverse da zero. Se dovessi semplicemente eseguire una simulazione più ampia, scopriresti che sono significativi. (Quando k=3 , 50000 iterazioni dovrebbero essere sufficienti.) Contrariamente a quanto affermato nella domanda, le correlazioni non "scompaiono del tutto".

In secondo luogo, un modo migliore per studiare questo fenomeno è tornare alla questione di base dell'indipendenza dei coefficienti. Sebbene nella maggior parte dei casi le correlazioni tendano ad essere vicine allo zero, la mancanza di indipendenza è chiaramente evidente. Ciò è reso più evidente studiando la distribuzione multivariata completa dei coefficienti diU . La natura della distribuzione emerge anche in piccole simulazioni in cui le correlazioni diverse da zero non possono (ancora) essere rilevate. Ad esempio, esaminare una matrice a dispersione dei coefficienti. Per renderlo praticabile, ho impostato la dimensione di ogni set di dati simulato su 4 e ho mantenuto k=2 , disegnando così 1000realizzazioni della matrice 4×2U , creando una matrice 1000×8 . Ecco la sua matrice full scatterplot, con le variabili elencate in base alla loro posizione all'interno di U :

figura

Scansione lungo la prima colonna rivela un interessante mancanza di indipendenza tra u11 e l'altra uij : sguardo a come quadrante superiore della dispersione con u21 è quasi vuoto, per esempio; oppure esaminare la nuvola ellittica inclinata verso l'alto che descrive la relazione (u11,u22) e la nuvola inclinata verso il basso per la coppia (u21,u12) . Uno sguardo ravvicinato rivela una chiara mancanza di indipendenza tra quasi tutti questi coefficienti: pochissimi sembrano remotamente indipendenti, anche se la maggior parte mostra una correlazione quasi zero.

(NB: la maggior parte delle nuvole circolari sono proiezioni da un'ipersfera creata dalla condizione di normalizzazione costringendo la somma dei quadrati di tutti i componenti di ogni colonna ad essere unità.)

Le matrici Scatterplot con k=3 e k=4 presentano modelli simili: questi fenomeni non si limitano a k=2 , né dipendono dalle dimensioni di ciascun set di dati simulato: diventano solo più difficili da generare ed esaminare.

Le spiegazioni per questi schemi vanno all'algoritmo usato per ottenere U nella decomposizione del valore singolare, ma sappiamo che tali schemi di non indipendenza devono esistere per le proprietà molto definitive di U : poiché ogni colonna successiva è (geometricamente) ortogonale alla precedente quelle, queste condizioni di ortogonalità impongono dipendenze funzionali tra i coefficienti, che si traducono quindi in dipendenze statistiche tra le corrispondenti variabili casuali.


modificare

In risposta ai commenti, può valere la pena di osservare in che misura questi fenomeni di dipendenza riflettono l'algoritmo sottostante (per calcolare un SVD) e quanto sono inerenti alla natura del processo.

I modelli specifici di correlazioni tra coefficienti dipendono molto dalle scelte arbitrarie fatte dall'algoritmo SVD, perché la soluzione non è unica: le colonne di U possono sempre essere moltiplicate indipendentemente per 1 o 1 . Non esiste un modo intrinseco per scegliere il segno. Pertanto, quando due algoritmi SVD effettuano scelte di segno diverse (arbitrarie o forse anche casuali), possono determinare diversi schemi di grafici a dispersione dei valori (uij,uij) . Se vuoi vedere questo, sostituisci la statfunzione nel codice qui sotto con

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
}

Questo prima riordina casualmente le osservazioni x, esegue SVD, quindi applica l'ordinamento inverso in modo uche corrisponda alla sequenza di osservazione originale. Poiché l'effetto è formare miscele di versioni riflesse e ruotate dei grafici a dispersione originali, i grafici a dispersione nella matrice appariranno molto più uniformi. Tutte le correlazioni del campione saranno estremamente vicine allo zero (per costruzione: le correlazioni sottostanti sono esattamente zero). Tuttavia, la mancanza di indipendenza sarà ancora evidente (nelle forme circolari uniformi che compaiono, in particolare tra ui,j e ui,j ).

La mancanza di dati in alcuni quadranti di alcuni dei grafici a dispersione originali (mostrati nella figura sopra) deriva da come l' Ralgoritmo SVD seleziona i segni per le colonne.

Non cambia nulla delle conclusioni. Poiché la seconda colonna di U è ortogonale alla prima, essa (considerata come variabile casuale multivariata) dipende dalla prima (considerata anche come variabile casuale multivariata). Non è possibile avere tutti i componenti di una colonna indipendenti da tutti i componenti dell'altra; tutto quello che puoi fare è guardare i dati in modo da oscurare le dipendenze, ma la dipendenza persisterà.


Ecco un Rcodice aggiornato per gestire i casi k>2 e disegnare una parte della matrice scatterplot.

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=".")

3
La correlazione si verifica tra i primi componenti delle colonne di perché è così che funziona l'algoritmo SVD. Che le file di X siano gaussiane è irrilevante: sono sicuro che hai notato che i coefficienti di U non sono gaussiani. UXU
whuber

2
A proposito, ho appena scoperto che la semplice sostituzione svd(X,0)con il svds(X)mio codice Matlab fa scomparire l'effetto! Per quanto ne so, queste due funzioni utilizzano algoritmi SVD diversi (entrambe sono routine LAPACK, ma apparentemente diverse). Non so se R ha una funzione simile a Matlab di svds, ma mi chiedo se si sta ancora andando a sostenere che si tratta di un effetto "reale" e non un problema numerico.
ameba dice di reintegrare Monica il

4
Signori, aspettate un minuto. Perché non stai parlando del segno? Il segno di un autovettore è sostanzialmente arbitrario. Ma il programma di svd non lo assegna in modo casuale, il segno dipende dall'implementazione di svd e dai dati. Se, dopo l'estrazione U, decidi a caso se ciascuna delle sue colonne deve rimanere così com'è o deve cambiare il suo segno, allora le correlazioni di cui stai parlando svaniranno?
ttnphns,

2
@ttnphns È corretto, come spiegato nella mia modifica. Anche se ciò fa svanire le correlazioni, le dipendenze tra le colonne di non scompaiono . (La versione migliorata di I fornita è equivalente alla modifica casuale dei segni delle colonne.)Ustat
whuber

2
Un punto minore (a questo grande thread!) L'SVD non richiede che gli elementi nella diagonale di Ssiano in un ordine particolare; è una questione di convenienza. Altre routine lo garantiscono (es. MATLAB svds) ma questo non è un requisito generale. @amoeba: guardando svds(che sembra libero da questo comportamento problematico) il calcolo si basa sul calcolo effettivo degli autovalori prima (quindi non usa le routine standard dgesdd/ dgesvdLAPACK - sospetto fortemente che usi dsyevr/ dsyevxall'inizio).
usεr11852 dice Reinstate Monic il

11

Questa risposta presenta una replica dei risultati di @ whuber in Matlab e anche una dimostrazione diretta che le correlazioni sono un "artefatto" di come l'implementazione SVD sceglie il segno per i componenti.

Data la lunga catena di commenti potenzialmente confusi, voglio sottolineare per i futuri lettori che sono pienamente d'accordo con quanto segue:

  1. Nel contesto di questa discussione, U è certamente una variabile casuale.
  2. Le colonne di devono essere di lunghezza 1 . Ciò significa che gli elementi all'interno di ciascuna colonna non sono indipendenti; i loro quadrati si sommano a uno. Tuttavia, ciò non implica alcuna correlazione tra U i 1 e U j 1 per i j e la correlazione del campione dovrebbe essere minuscola per un numero elevato N r e pU1Ui1Uj1ijNrep delle estrazioni casuale.
  3. Le colonne di devono essere ortogonali. Ciò significa che gli elementi di colonne diverse non sono indipendenti; il loro prodotto punto è zero. Ancora una volta, ciò non implica alcuna correlazione tra U i 1 e U j 2UUi1Uj2 e la correlazione del campione dovrebbe essere minuscola.

0.2Nrep=1000 ?

n=4k=2Nrep=1000 in Matlab:

SVD

A sinistra è la matrice di correlazione, a destra - grafici a dispersione simili a quelli di @ whuber. L'accordo tra le nostre simulazioni sembra perfetto.

U

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

Aggiungo le seguenti due righe:

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

Ecco il risultato:

SVD with random signs

Tutte le correlazioni svaniscono, esattamente come mi aspettavo dall'inizio !

11 ). Ma le correlazioni svaniscono.

UU

PS. Congratulazioni a @whuber per aver superato la reputazione di 100k oggi!


statstat <- function(x) { u <- svd(x)$u; as.vector(sign(runif(1) - 1/2)*u %*% diag(sign(diag(u)))) }U(u11,u22,...,uKK)e come tale fornisce un'ulteriore dimostrazione del perché potresti voler separare i concetti di correlazione (dei componenti diU) dall'indipendenza (delle colonne diU). La presenza di queste grandi correlazioni non implica che ci sia un bug in SVD!
whuber

Ho appena finito di modificare questa risposta, @whuber; Ho sostituito svdsda svdseguita da una scelta segno casuale per le colonne diU. Sono d'accordo con te: le alte correlazioni erano interamente dovute alla scelta del segno, come ipotizzato da ttnphns. Ciò fornisce una risposta soddisfacente alla mia domanda. Ora proviamo a risolvere i disaccordi! Ho concordato che gli elementi diUsono variabili casuali e che non sono indipendenti. Saresti d'accordo sul fatto che la cifra nella tua risposta fosse super fuorviante e che usare le correlazioni di 0,2 come argomento nel nostro precedente dibattito fosse sbagliato?
ameba dice di reintegrare Monica il

Non sarei d'accordo: la figura mostra accuratamente i risultati delle impostazioni predefinite di SVD in R. Ho fornito spiegazioni per quel comportamento che sono radicate nell'algoritmo e nella teoria sottostante. Se qualsiasi aspetto di questo è "super fuorviante", ovviamente, cercherò di correggere o chiarire il problema, ma a questo punto non sono a conoscenza di un problema specifico da risolvere. Potresti essere interessato a notare che la versione modificata fornita nel mio commento precedente a questa domanda è in grado di produrre correlazioni in giro±2/3, piuttosto in alto: non c'è niente di speciale nel tuo 0.2.
whuber

1
@ttnphns: il punto principale di Whuber è che gli elementi di Unon sono indipendenti. Gli elementi all'interno di una colonna non sono indipendenti perché i loro quadrati devono essere sommati a uno. Gli elementi di colonne diverse non sono indipendenti, poiché le colonne devono avere un prodotto a punto zero. Quindi se conosci tutti gli elementi della prima colonna oltre all'ultima, puoi calcolarla; se conosci ulteriormente tutti gli elementi della seconda colonna oltre agli ultimi due, puoi calcolarli. Questo significa, sia definizione, che non sono indipendenti.
amoeba says Reinstate Monica

1
Intuitively, that's fair. As soon as the first principal axis is defined in space the rest pr. axes get reduced freedom. In case of 2D data the second (last) PC is tied entirely, except the sign. I'd rather call it constraint, not dependence in statistical sense.
ttnphns

0

Check the norm of your singular vectors U and V, it's 1 by definition. You don't need to go through SVD to get the same exact matrix you plot by simply generating two random variables x and y with the constraint that the sum of their squares is 1:

x2+y2=1

Assume that the means are zero, then

Cov[x,y]=Var[xy]=E[x2y2]E[xy]2

This will not be equal to zero. You can plug the standard normal into x and y to see what's the value of covariance to be expected here.


Although this observation is pertinent, it addresses only interdependencies among the individual components of each column (and as such is included within the k(k+1)/2 independent constraints on U). The question that got all this started concerned dependencies between different columns of U: that's why so little attention has been paid to correlations within each column. Another (perhaps fruitful) way to look at this is to roll D into U and analyze the columns of UD, which are no longer normalized, but are still subject to k(k1)/2 constraints.
whuber

It's the columns of U that have length 1, not the rows (in case when U is not square, but has n rows and k columns with n>k). The columns of U have n elements, and we have been discussing two particular cases in this thread: in my question I suggested to consider n=1000, and in his answer @whuber chose to consider n=4. Your example with x2+y2=1 includes only two random variables, so it does not fit to the rest of the discussion here. If you could make a statement about what should be the correlation between two elements of one column of U, that would be interesting.
amoeba says Reinstate Monica

@Amoeba We can make Asksakal's example pertinent either by taking x to be the first component of a column of U and y to be the norm of the remaining components or by extending the example inductively to more variables. Unfortunately, the conclusion is incorrect: it is perfectly possible for x2+y2=1, each with zero mean, yet for Cov(x,y)=0. Take, for instance, x=cos(θ) and y=sin(θ) for θ uniformly distributed on [0,2π).
whuber

@whuber, yes, I agree. The mistake in Aksakal's argument is that individual elements of U are definitely not standard normal! If the sign of each column is randomized, then (in my simulation) the mean of each Uij is around 0 and the variance is around 1/n, which makes total sense -- add up n variances in one column and you will get n1/n=1, as required by the constraint. This is assuming the elements are uncorrelateed, which they seem to be.
amoeba says Reinstate Monica

1
@Aksakal, I invite you to run a simulation and see for yourself that they are indeed uncorrelated; just be sure to randomize the sign of each column of U on each iteration. If you want an intuitive proof, observe that there is nothing "special" about any particular row of X, meaning that if correlation between U11 and U21 is ρ, then it must be the same for any other pair. So we have n random variables with correlation matrix having all off-diagonal elements equal to ρ. Now, is ρ positive or negative? The problem doesn't seem to offer a choice, hence ρ=0.
amoeba says Reinstate Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.