Ich beobachte ein sehr seltsames Verhalten beim SVD-Ergebnis von Zufallsdaten, das ich sowohl in Matlab als auch in R reproduzieren kann. Es scheint ein numerisches Problem in der LAPACK-Bibliothek zu sein. ist es?
Ich ziehe Proben aus dem dimensionalen Gaußschen mit dem Mittelwert Null und der Identitätskovarianz: . Ich setze sie in eine Datenmatrix . (Ich kann wahlweise oder nicht, dies hat keinen Einfluss auf Folgendes.) Dann führe ich eine Singularwertzerlegung (SVD) durch, um . Nehmen wir zwei bestimmte Elemente von , z. B. und , und fragen Sie, wie sie in verschiedenen Zügen von . Ich würde das erwarten, wenn die Nummer von Ziehungen ist ziemlich groß, dann sollten alle diese Korrelationen um Null liegen (dh Populationskorrelationen sollten Null sein und Stichprobenkorrelationen werden klein sein).
Ich beobachte jedoch einige seltsam starke Korrelationen (um ) zwischen , , und und nur zwischen diesen Elementen. Alle anderen Elementpaare weisen erwartungsgemäß Korrelationen um Null auf. So sieht die Korrelationsmatrix für die "oberen" Elemente von aus (die ersten Elemente der ersten Spalte, dann die ersten Elemente der zweiten Spalte):
Beachten Sie seltsam hohe Werte in den oberen linken Ecken jedes Quadranten.
Es war dieser Kommentar von @ whuber, der mich auf diesen Effekt aufmerksam machte. @whuber argumentierte, dass PC1 und PC2 nicht unabhängig voneinander sind und präsentierte diese starke Korrelation als Beweis dafür. Mein Eindruck ist jedoch, dass er versehentlich einen numerischen Fehler in der LAPACK-Bibliothek entdeckt hat. Was geht hier vor sich?
Hier ist der R-Code von @ 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]);
Hier ist mein Matlab-Code:
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')
quelle
Antworten:
Dies ist kein Fehler.
Wie wir (ausführlich) in den Kommentaren untersucht haben, geschehen zwei Dinge. Zum einen müssen die Spalten von die SVD-Anforderungen erfüllen: Jede muss eine Einheitslänge haben und zu allen anderen orthogonal sein. Betrachtet man als eine Zufallsvariable, die mit einem bestimmten SVD-Algorithmus aus einer Zufallsmatrix , so stellt man fest, dass diese funktional unabhängigen Nebenbedingungen statistische Abhängigkeiten zwischen den Spalten von erzeugen .U U X k ( k + 1 ) / 2 U
Diese Abhängigkeiten können auf eine mehr oder weniger stark aufgedeckt werden , indem die Korrelationen zwischen den Komponenten des Studierens , sondern ein zweites Phänomen entsteht : die SVD - Lösung nicht eindeutig ist. Zumindest kann jede Spalte von unabhängig negiert werden, was mindestens verschiedene Lösungen mit Spalten ergibt . Starke Korrelationen (größer als ) können durch geeignete Änderung der Vorzeichen der Spalten induziert werden. (Ein Weg, dies zu tun, ist in meinem ersten Kommentar zu Amoebas Antwort in diesem Thread angegeben: Ich erzwinge alleU U 2 k k 1 / 2 u i i , i = 1 , ... , kU 2k k 1 / 2 uich ich, i = 1 , … , k dasselbe Vorzeichen haben und alle mit gleicher Wahrscheinlichkeit negativ oder alle positiv machen.) Andererseits können alle Korrelationen verschwinden, indem die Vorzeichen zufällig, unabhängig voneinander und mit gleicher Wahrscheinlichkeit ausgewählt werden. (Ich gebe ein Beispiel unten im Abschnitt "Bearbeiten".)
Mit Vorsicht können wir beide Phänomene teilweise erkennen, wenn wir Streudiagramm-Matrizen der Komponenten von lesen . Bestimmte Merkmale - wie das Auftreten von Punkten, die in genau definierten Kreisregionen nahezu gleichmäßig verteilt sind - lassen auf mangelnde Unabhängigkeit schließen. Andere, wie zum Beispiel Streudiagramme, die eindeutige Korrelationen ungleich Null zeigen, hängen offensichtlich von den im Algorithmus getroffenen Entscheidungen ab - aber solche Entscheidungen sind nur möglich, weil es an erster Stelle an Unabhängigkeit mangelt.U
Der ultimative Test für einen Zerlegungsalgorithmus wie SVD (oder Cholesky, LR, LU usw.) ist, ob er das tut, was er behauptet. Unter diesen Umständen genügt es zu prüfen , ob bis zum erwarteten Gleitkommafehler durch das Produkt wiederhergestellt wird, wenn SVD das Dreifache der Matrizen zurückgibt . dass die Spalten von und von orthonormal sind; und dass diagonal ist, seine diagonalen Elemente nicht negativ sind und in absteigender Reihenfolge angeordnet sind. Ich habe solche Tests auf den Algorithmus in angewendet( U, D , V) X UD V′ U V D
svd
R
und habe es nie für falsch befunden. Obwohl dies keine Zusicherung ist, ist es völlig richtig, dass solche Erfahrungen - von denen ich glaube, dass sie von sehr vielen Menschen geteilt werden - darauf hindeuten, dass jeder Fehler eine außergewöhnliche Art von Input erfordert, um sich zu manifestieren.Was folgt, ist eine detailliertere Analyse der in der Frage aufgeworfenen Punkte.
Mitk U k = 3k = 3
R
dersvd
Prozedur von 's können Sie zunächst überprüfen, ob die Korrelationen zwischen den Koeffizienten von zunehmendem schwächer werden, aber immer noch ungleich Null sind. Wenn Sie einfach eine größere Simulation durchführen würden, würden Sie feststellen, dass diese signifikant sind. (Wenn , sollten 50000 Iterationen ausreichen.) Entgegen der Behauptung in der Frage verschwinden die Korrelationen nicht "vollständig".Zweitens lässt sich dieses Phänomen besser untersuchen, indem man auf die Grundfrage der Unabhängigkeit der Koeffizienten zurückgeht. Obwohl die Korrelationen in den meisten Fällen gegen Null tendieren, ist der Mangel an Unabhängigkeit klar ersichtlich. Dies wird am deutlichsten durch die vollständige multivariate Verteilung der Koeffizienten des Studierens . Die Art der Verteilung zeigt sich bereits in kleinen Simulationen, in denen die Nicht-Null-Korrelationen (noch) nicht erfasst werden können. Untersuchen Sie beispielsweise eine Streudiagramm-Matrix der Koeffizienten. Um dies praktikabel zu machen, habe ich die Größe jedes simulierten Datensatzes auf und beibehalten , um Realisierungen der zu zeichnenU 4 k = 2 1000 4 × 2 Matrix , wodurch eine Matrix erstellt wird. Hier ist die vollständige Streudiagramm-Matrix mit den Variablen, die nach ihrer Position in aufgelistet sind :U 1000 × 8 U
Das der ersten Spalte zeigt einen interessanten Mangel an Unabhängigkeit zwischen und dem anderen : Sehen Sie sich beispielsweise an, wie der obere Quadrant des mit fast leer ist. oder untersuchen Sie die elliptisch nach oben geneigte Wolke, die die und die nach unten geneigte Wolke für das . Bei genauer Betrachtung zeigt sich ein deutlicher Mangel an Unabhängigkeit bei fast allen dieser Koeffizienten: Nur sehr wenige von ihnen sehen aus der Ferne unabhängig aus, obwohl die meisten von ihnen eine Korrelation nahe Null aufweisen.u11 uich j u21 ( u11, u22) ( u21, u12)
(NB: Die meisten kreisförmigen Wolken sind Projektionen von einer Hypersphäre, die durch die Normalisierungsbedingung erzeugt wurden und die Summe der Quadrate aller Komponenten jeder Spalte zu einer Einheit zwingen.)
Scatterplot-Matrizen mit und weisen ähnliche Muster auf: Diese Phänomene sind weder auf , noch hängen sie von der Größe jedes simulierten Datensatzes ab. Sie werden nur schwieriger zu generieren und zu untersuchen.k = 3 k = 4 k = 2
Die Erklärungen für diese Muster beziehen sich auf den Algorithmus, der verwendet wird, um bei der Singularwertzerlegung zu erhalten , aber wir wissen, dass solche Muster der Nichtunabhängigkeit durch die sehr definierenden Eigenschaften von existieren müssen : da jede aufeinanderfolgende Spalte (geometrisch) orthogonal zu der vorhergehenden ist Unter diesen Orthogonalitätsbedingungen bestehen funktionelle Abhängigkeiten zwischen den Koeffizienten, die sich dadurch in statistischen Abhängigkeiten zwischen den entsprechenden Zufallsvariablen niederschlagen.U UU
Bearbeiten
In Reaktion auf Kommentare ist es möglicherweise erwähnenswert, inwieweit diese Abhängigkeitsphänomene den zugrunde liegenden Algorithmus (zur Berechnung einer SVD) widerspiegeln und inwieweit sie der Art des Prozesses inhärent sind.
Die spezifischen Korrelationsmuster zwischen den Koeffizienten hängen in hohem Maße von willkürlichen Auswahlen ab, die vom SVD-Algorithmus getroffen werden, da die Lösung nicht eindeutig ist: Die Spalten von können immer unabhängig voneinander mit oder multipliziert werden . Es gibt keinen eigentlichen Weg, das Zeichen zu wählen. Wenn also zwei SVD-Algorithmen unterschiedliche (willkürliche oder sogar zufällige) Vorzeichenwahlen treffen, können sie zu unterschiedlichen Mustern von der . Wenn Sie dies sehen möchten, ersetzen Sie die Funktion im folgenden Code durchU - 1 1 ( uich j, uich′j′)
stat
Diese ordnet die Beobachtungen zunächst nach dem Zufallsprinzip neu anuich , j uich , j′
x
, führt eine SVD durch und wendet dann die umgekehrte Reihenfolge anu
, um mit der ursprünglichen Beobachtungssequenz übereinzustimmen. Da der Effekt darin besteht, Mischungen aus reflektierten und gedrehten Versionen der ursprünglichen Streudiagramme zu bilden, sehen die Streudiagramme in der Matrix viel gleichmäßiger aus. Alle Beispielkorrelationen sind extrem nahe bei Null (konstruktionsbedingt sind die zugrunde liegenden Korrelationen genau Null). Dennoch wird der Mangel an Unabhängigkeit weiterhin offensichtlich sein (in den einheitlichen Kreisformen, die insbesondere zwischen und ).Das Fehlen von Daten in einigen Quadranten einiger der ursprünglichen Streudiagramme (siehe Abbildung oben) ergibt sich daraus, wie der
R
SVD-Algorithmus Vorzeichen für die Spalten auswählt.An den Schlussfolgerungen ändert sich nichts. Da die zweite Spalte von orthogonal zur ersten ist, ist sie (als multivariate Zufallsvariable betrachtet) von der ersten abhängig (auch als multivariate Zufallsvariable betrachtet). Sie können nicht alle Komponenten einer Spalte von allen Komponenten der anderen unabhängig machen. Alles, was Sie tun können, ist, die Daten so zu betrachten, dass die Abhängigkeiten verschleiert werden - die Abhängigkeit bleibt jedoch bestehen.U
Hier wird derk > 2
R
Code aktualisiert , um die Fälle und einen Teil der Streudiagramm-Matrix zu zeichnen.quelle
svd(X,0)
durchsvds(X)
in meinem Matlab-Code der Effekt verschwindet! Soweit ich weiß, verwenden diese beiden Funktionen unterschiedliche SVD-Algorithmen (beide sind LAPACK-Routinen, aber offensichtlich unterschiedliche). Ich weiß nicht, ob R eine ähnliche Funktion wie Matlab hatsvds
, aber ich frage mich, ob Sie immer noch behaupten werden, dass es sich um einen "echten" Effekt und nicht um ein numerisches Problem handelt.U
zufällig entscheiden, ob jede ihrer Spalten unverändert bleiben oder das Vorzeichen ändern soll, verschwinden dann nicht die Korrelationen, von denen Sie sprechen?stat
S
in einer bestimmten Reihenfolge sind; Es ist eine Frage der Bequemlichkeit. Andere Routinen garantieren dies (z. B. MATLABssvds
), aber das ist keine allgemeine Anforderung. @amoeba: Betrachtet mansvds
(was von diesem problematischen Verhalten frei zu sein scheint), basiert die Berechnung darauf, dass zuerst die Eigenwerte berechnet werden (es werden also nicht die Standard-dgesdd
/dgesvd
LAPACK-Routinen verwendet - ich vermute stark, dass es zuerstdsyevr
/ verwendetdsyevx
).Diese Antwort enthält eine Replikation der Ergebnisse von @ whuber in Matlab sowie eine direkte Demonstration, dass die Korrelationen ein "Artefakt" dafür sind, wie die SVD-Implementierung das Vorzeichen für Komponenten auswählt.
In Anbetracht der langen Kette von möglicherweise verwirrenden Kommentaren möchte ich für die zukünftigen Leser betonen, dass ich mit Folgendem einverstanden bin:
Meine Frage war: Warum sehen wir hohe Korrelationen von wenn für eine große Anzahl zufälliger Ziehungen N r e p = 1000 gilt ?≤ 0,2 Nr e p= 1000
Hier ist eine Replikation von @ whubers Beispiel mit , k = 2 und N r e p = 1000 in Matlab:n = 4 k = 2 Nr e p= 1000
Links die Korrelationsmatrix, rechts die Streudiagramme ähnlich wie bei @ whuber's. Die Übereinstimmung zwischen unseren Simulationen scheint perfekt zu sein.
Nun ordne ich, einem genialen Vorschlag von @ttnphns folgend, den Spalten von zufällige Vorzeichen zu , dh nach dieser Zeile:U
Ich füge die folgenden zwei Zeilen hinzu:
Hier ist das Ergebnis:
Alle Korrelationen verschwinden, genau wie ich es von Anfang an erwartet hatte !
PS. Herzlichen Glückwunsch an @whuber, dass er heute 100.000 Punkte erreicht hat!
quelle
stat
stat <- function(x) { u <- svd(x)$u; as.vector(sign(runif(1) - 1/2)*u %*% diag(sign(diag(u)))) }
svds
svd
R
quelle