So führen Sie eine Dimensionsreduktion mit PCA in R durch

30

Ich habe einen großen Datensatz und möchte eine Dimensionsreduktion durchführen.

Jetzt lese ich überall, dass ich PCA dafür verwenden kann. Ich scheine jedoch immer noch nicht zu verstehen, was ich tun soll, nachdem ich die PCA berechnet / durchgeführt habe. In R ist dies mit dem Befehl einfach zu bewerkstelligen princomp.

Aber was ist nach der Berechnung des PCA zu tun? Wie kann ich meinen Datensatz genau reduzieren, wenn ich die ersten Hauptkomponenten verwenden möchte?100

Floris Devriendt
quelle
Diese Frage ist nicht sehr klar (100 PCs sind Ihr Datensatz mit reduzierter Dimensionalität), sondern betrifft insbesondere die Rekonstruktion der ursprünglichen Variablen (das Thema der akzeptierten Antwort) .
Amöbe sagt Reinstate Monica

Antworten:

35

Ich glaube, was Sie in Ihrer Frage ansprechen, betrifft das Abschneiden von Daten mit einer geringeren Anzahl von Hauptkomponenten (PC). Für solche Operationen halte ich die Funktion prcompfür anschaulicher, da es einfacher ist, die bei der Rekonstruktion verwendete Matrixmultiplikation zu visualisieren.

Geben Sie zunächst einen synthetischen Datensatz an, Xtund führen Sie die PCA durch (in der Regel zentrieren Sie Stichproben, um PCs zu beschreiben, die sich auf eine Kovarianzmatrix beziehen):

#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n

#True field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)

#PCA
res <- prcomp(Xt, center = TRUE, scale = FALSE)
names(res)

In den Ergebnissen oder sehen prcompSie die PC's ( res$x), die Eigenwerte ( res$sdev), die Informationen zur Größe der einzelnen PCs und die Ladungen ( res$rotation).

res$sdev
length(res$sdev)
res$rotation
dim(res$rotation)
res$x
dim(res$x)

Durch Quadrieren der Eigenwerte erhalten Sie die von jedem PC erklärte Varianz:

plot(cumsum(res$sdev^2/sum(res$sdev^2))) #cumulative explained variance

Schließlich können Sie eine abgeschnittene Version Ihrer Daten erstellen, indem Sie nur die führenden (wichtigen) PCs verwenden:

pc.use <- 3 # explains 93% of variance
trunc <- res$x[,1:pc.use] %*% t(res$rotation[,1:pc.use])

#and add the center (and re-scale) back to data
if(res$scale != FALSE){
	trunc <- scale(trunc, center = FALSE , scale=1/res$scale)
}
if(res$center != FALSE){
    trunc <- scale(trunc, center = -1 * res$center, scale=FALSE)
}
dim(trunc); dim(Xt)

Sie sehen, dass das Ergebnis eine etwas glattere Datenmatrix mit herausgefilterten Funktionen im kleinen Maßstab ist:

RAN <- range(cbind(Xt, trunc))
BREAKS <- seq(RAN[1], RAN[2],,100)
COLS <- rainbow(length(BREAKS)-1)
par(mfcol=c(1,2), mar=c(1,1,2,1))
image(Xt, main="Original matrix", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()
image(trunc, main="Truncated matrix (3 PCs)", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()

Bildbeschreibung hier eingeben

Und hier ist ein sehr grundlegender Ansatz, den Sie außerhalb der Funktion prcomp ausführen können:

#alternate approach
Xt.cen <- scale(Xt, center=TRUE, scale=FALSE)
C <- cov(Xt.cen, use="pair")
E <- svd(C)
A <- Xt.cen %*% E$u

#To remove units from principal components (A)
#function for the exponent of a matrix
"%^%" <- function(S, power)
     with(eigen(S), vectors %*% (values^power * t(vectors)))
Asc <- A %*% (diag(E$d) %^% -0.5) # scaled principal components

#Relationship between eigenvalues from both approaches
plot(res$sdev^2, E$d) #PCA via a covariance matrix - the eigenvalues now hold variance, not stdev
abline(0,1) # same results

Die Entscheidung, welche PCs aufbewahrt werden sollen, ist eine separate Frage , die mich vor einiger Zeit interessiert hat . Hoffentlich hilft das.

Marc in der Kiste
quelle
2
Marc, Sie müssen Center und Skalierung nicht explizit aufzeichnen, das prcomperledigt er für Sie. Schauen Sie sich res$centerund an res$scale. IMHO ist es weniger fehleranfällig, diese zu verwenden (kein zufälliger Unterschied bezüglich Zentrierung oder nicht / Skalierung oder nicht zwischen dem expliziten Aufruf an scaleund dem prcompAufruf).
cbeleites unterstützt Monica
1
Diese Antwort muss erweitert werden, da sie nicht die Fragen des OP zu what to do after calculating the PCAoder how do I reduce my dataset exactly? Beantwortet . Angesichts der Tatsache, dass das OP eine PCA für seine Stichprobe durchgeführt hat, ist seine Frage, was damit zu tun ist und was mit diesen Teilstichproben tatsächlich vor sich geht. nicht, wie man PCA macht. Wir könnten genauso gut vorschlagen E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectors, einen weiteren Weg zu finden, um auch die Scores zu erhalten (was genau das ist, was princomp tut stats:::princomp.default).
usεr11852 sagt Reinstate Monic
1
@ user11852 - Die Frage bezieht sich speziell auf die Verkleinerung des Datensatzes (dh die Kürzung, die ich hier gezeigt habe). Ich überlasse es ihm, ob er danach suchte oder nicht.
Marc in der Box
1
@ Marc, danke für die Antwort. Ich denke, ich muss vielleicht einen Schritt zurücktreten und alles noch einmal durchlesen, weil ich nicht sicher bin, wie sich eine der obigen Antworten auf die Reduzierung der Dimensionalität auswirkt. Denn wie Sie zeigen, ist dim (trunc) = dim (Xt). Was der Vorteil davon war, wurden die Dimensionen nicht reduziert.
B_Miner
2
@B_Miner - Denken Sie daran, dass das Abschneiden verwendet wird, um sich auf die Hauptmuster in Daten zu konzentrieren und kleine Muster und Rauschen herauszufiltern. Die abgeschnittenen Daten sind in Bezug auf ihre Abmessungen nicht kleiner, sondern "sauberer". Das Abschneiden verringert jedoch die Datenmenge, indem die gesamte Matrix mit nur wenigen Vektoren rekonstruiert werden kann. Ein gutes Beispiel ist die Verwendung von PCA zur Bildkomprimierung, bei der eine geringere Anzahl von PCs zur Rekonstruktion des Bildes verwendet werden kann. Diese kleinere Untergruppe von Vektoren nimmt weniger Speicherplatz in Anspruch, aber die Rekonstruktion führt zu einem gewissen Detailverlust im kleinen Maßstab.
Marc in der Box
3

Diese anderen Antworten sind sehr gut und detailliert, aber ich frage mich, ob Sie tatsächlich eine wesentlich grundlegendere Frage stellen: Was machen Sie, wenn Sie Ihre PCs haben?

Jeder PC wird einfach zu einer neuen Variablen. Angenommen, PC1 macht 60% der gesamten Variation aus und PC2 30%. Da dies 90% der gesamten Variation ausmacht, können Sie diese beiden neuen Variablen (PCs) einfach als vereinfachte Version Ihrer ursprünglichen Variablen verwenden. Das bedeutet, sie an Modelle anzupassen, wenn Sie daran interessiert sind. Wenn es an der Zeit ist, Ihre Ergebnisse zu interpretieren, tun Sie dies im Kontext der ursprünglichen Variablen, die mit jedem PC korrelieren.

Entschuldigung, wenn ich den Umfang der Frage unterschätzt habe!

atrichornis
quelle
2

ichλichΣk=1pλkpp=784λ

Praktisch mit PCA verwenden Sie die Projektionen der PCs (die "Scores") als Ersatzdaten für Ihre Originalprobe. Sie analysieren alle Ergebnisse und rekonstruieren anschließend Ihre Originalprobe mithilfe der PCs, um herauszufinden, was in Ihrem ursprünglichen Bereich passiert ist (das ist im Grunde genommen die Regression der Hauptkomponenten ). Wenn Sie in der Lage sind, Ihre Eigenvektoren ("Ladungen") aussagekräftig zu interpretieren, sind Sie in einer noch besseren Position: Sie können beschreiben, was mit Ihrer Stichprobe in der durch diese Belastung dargestellten Variationsart geschieht, indem Sie direkt auf diese Belastung schließen und kümmert sich überhaupt nicht um den Wiederaufbau. :)

Was Sie "nach der Berechnung des PCA" tun, hängt im Allgemeinen vom Ziel Ihrer Analyse ab. PCA gibt Ihnen lediglich eine linear unabhängige Teilstichprobe Ihrer Daten, die unter einem RSS-Rekonstruktionskriterium optimal ist. Sie können es zur Klassifizierung oder Regression oder für beide Zwecke verwenden, oder Sie möchten, wie bereits erwähnt, sinnvolle orthogonale Variationsmodi in Ihrer Stichprobe erkennen.

Ein Kommentar : Ich denke, die beste naive Möglichkeit, die Anzahl der beizubehaltenden Komponenten zu bestimmen, besteht darin, Ihre Schätzung auf einen Schwellenwert für die Variation der Stichprobe zu stützen, den Sie in Ihrer Stichprobe mit reduzierter Dimension beibehalten möchten, anstatt nur auf eine beliebige Zahl, z. 3, 100, 200. Wie der Benutzer 4959 erklärte, können Sie diese kumulative Variation überprüfen, indem Sie das relevante Feld der Liste unter dem $loadingsFeld im Listenobjekt überprüfen, das von erstellt wurde princomp.

usεr11852 sagt Reinstate Monic
quelle
1
Wie Sie bereits erwähnt haben, wird in R die Hauptkomponenten-Regression durch Paket-pls bereitgestellt. Was die Anzahl der zu behaltenden Komponenten angeht, sehe ich keinen wirklichen Vorteil darin, die prozentuale Abweichung gegenüber der Zahl No. von Komponenten (möglicherweise deshalb, weil ich mit Daten arbeite, die sehr unterschiedliche Rauschniveaus aufweisen. Wie @ Marc-in-the-Box erwähnt, gibt es viele verschiedene Ansätze, um eine geeignete Anzahl von PCs zu bestimmen, und die Strategie wird ( sollte) sowohl von der Art der Daten als auch von der Art der Datenanalyse abhängen, die folgen soll.
cbeleites unterstützt Monica
plsprincomp {stats}KKDD
1
Ja, es ist naiv. Ich stimme nicht zu, dass die Einstellung eines beliebigen Prozentsatzes der erklärten Varianz einen wesentlichen Vorteil gegenüber anderen willkürlichen Grenzwerten hat. Aber es lohnt sich sowieso nicht, darüber zu streiten, da a) das OP nie um Rat gefragt hat, ob es die Nummer wählen soll. von PCs zu behalten und b) Ich denke, wir sind uns einig, dass eine ordnungsgemäße Inspektion des PCA-Modells auf jeden Fall erfolgen sollte.
cbeleites unterstützt Monica am
Kein Problem; es war sowieso nur ein Kommentar, den ich vor meiner Antwort gemacht habe. (Ich werde meinen Kommentar als letztes
einfügen,
0

Nach der PCA können Sie die ersten beiden Komponenten auswählen und grafisch darstellen. Sie können die Variation der Komponenten anhand eines Gerölldiagramms in R sehen. Auch mithilfe der Zusammenfassungsfunktion mit Belastungen = T können Sie die Variation der Merkmale mit den Komponenten definieren.

Sie können auch http://www.statmethods.net/advstats/factor.html und http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf aufrufen

Versuchen Sie zu überlegen, was Sie wollen. Mit der PCA-Analyse können Sie viele Dinge interpretieren.

Bester Abhik

user4959
quelle