Wenn ich eine 2-D-Matrix konstruiere, die vollständig aus Zufallsdaten besteht, würde ich erwarten, dass die PCA- und SVD-Komponenten im Wesentlichen nichts erklären.
Stattdessen scheint die erste SVD-Spalte 75% der Daten zu erklären. Wie kann das möglich sein? Was mache ich falsch?
Hier ist die Handlung:
Hier ist der R-Code:
set.seed(1)
rm(list=ls())
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
svd1 <- svd(m, LINPACK=T)
par(mfrow=c(1,4))
image(t(m)[,nrow(m):1])
plot(svd1$d,cex.lab=2, xlab="SVD Column",ylab="Singluar Value",pch=19)
percentVarianceExplained = svd1$d^2/sum(svd1$d^2) * 100
plot(percentVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD Column",ylab="Percent of variance explained",pch=19)
cumulativeVarianceExplained = cumsum(svd1$d^2/sum(svd1$d^2)) * 100
plot(cumulativeVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD column",ylab="Cumulative percent of variance explained",pch=19)
Aktualisieren
Vielen Dank an Aaron. Wie Sie bemerkt haben, bestand die Korrektur darin, die Matrix so zu skalieren, dass die Zahlen um 0 zentriert sind (dh der Mittelwert ist 0).
m <- scale(m, scale=FALSE)
Hier ist das korrigierte Bild, das für eine Matrix mit Zufallsdaten zeigt, dass die erste SVD-Spalte erwartungsgemäß nahe bei 0 liegt.
Antworten:
Der erste PC erklärt, dass die Variablen nicht um Null zentriert sind. Wenn Sie zuerst skalieren oder Ihre Zufallsvariablen um Null zentrieren, erhalten Sie das erwartete Ergebnis. Zum Beispiel:
quelle
Ich werde Ihrer Frage eine visuellere Antwort hinzufügen, indem ich einen Nullmodellvergleich verwende. Die Prozedur mischt die Daten in jeder Spalte nach dem Zufallsprinzip, um die Gesamtvarianz beizubehalten, während die Kovarianz zwischen Variablen (Spalten) verloren geht. Dies wird mehrmals durchgeführt und die resultierende Verteilung der Singularwerte in der randomisierten Matrix wird mit den Originalwerten verglichen.
Ich benutze
prcomp
stattsvd
für die Matrixzerlegung, aber die Ergebnisse sind ähnlich:Der Nullmodellvergleich wird in der folgenden zentrierten Matrix durchgeführt:
Das Folgende ist ein Boxplot der permutierten Matrix, wobei das 95% -Quantil jedes Singularwerts als durchgezogene Linie dargestellt ist. Die ursprünglichen PCA-Werte
m
sind die Punkte. alle liegen unterhalb der 95% -Linie - daher ist ihre Amplitude nicht von zufälligem Rauschen zu unterscheiden.Dieselbe Prozedur kann mit der nicht zentrierten Version von
m
mit demselben Ergebnis durchgeführt werden - Keine signifikanten singulären Werte:Schauen wir uns zum Vergleich einen Datensatz mit einem nicht zufälligen Datensatz an:
iris
Hier ist der 1. Singularwert signifikant und erklärt über 92% der Gesamtvarianz:
quelle