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 testsvd
all'algoritmo inR
e 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 R
la svd
procedura, 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 :
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,ui′j′) . Se vuoi vedere questo, sostituisci la stat
funzione 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 u
che 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' R
algoritmo 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 R
codice 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=".")