Come eseguire la riduzione della dimensionalità con PCA in R


30

Ho un grande set di dati e voglio eseguire una riduzione di dimensionalità.

Ora ovunque leggo che posso usare PCA per questo. Tuttavia, non riesco ancora a capire cosa fare dopo aver calcolato / eseguito il PCA. In R questo è facilmente eseguibile con il comando princomp.

Ma cosa fare dopo aver calcolato il PCA? Se ho deciso di voler utilizzare i primi componenti principali, come posso ridurre il mio set di dati esattamente?100


Questa domanda non è molto chiara (100 PC sono il tuo set di dati di ridotta dimensionalità), ma in particolare sulla ricostruzione delle variabili originali (argomento della risposta accettata) vedi anche: Come invertire PCA e ricostruire variabili originali da diversi componenti principali?
ameba dice di reintegrare Monica il

Risposte:


35

Credo che ciò a cui stai arrivando nella tua domanda riguardi il troncamento dei dati utilizzando un numero inferiore di componenti principali (PC). Per tali operazioni, penso che la funzione prcompsia più illustrativa in quanto è più facile visualizzare la moltiplicazione della matrice utilizzata nella ricostruzione.

Innanzitutto, dai un set di dati sintetico, Xtesegui il PCA (in genere centreresti i campioni per descrivere i PC relativi a una matrice di covarianza:

#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)

Nei risultati oppure prcomp, è possibile visualizzare il PC ( res$x), gli autovalori ( res$sdev) che forniscono informazioni sulla grandezza di ciascun PC e i caricamenti ( res$rotation).

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

Quadrando gli autovalori, si ottiene la varianza spiegata da ciascun PC:

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

Infine, puoi creare una versione troncata dei tuoi dati utilizzando solo i PC (importanti) principali:

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)

Puoi vedere che il risultato è una matrice di dati leggermente più fluida, con caratteristiche su piccola scala filtrate:

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()

inserisci qui la descrizione dell'immagine

Ed ecco un approccio molto semplice che puoi fare al di fuori della funzione prcomp:

#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

Ora, decidere quali PC conservare è una domanda separata, una questione a cui ero interessato qualche tempo fa . Spero che sia d'aiuto.


2
Marc, non hai bisogno di registrare il centro e ridimensionare esplicitamente, lo prcompfa per te. Dai un'occhiata a res$centere res$scale. IMHO è meno incline all'utilizzo di questi (nessuna differenza accidentale sul centraggio o meno / ridimensionamento o meno tra la chiamata esplicita scalee la prcompchiamata).
cbeleites supporta Monica il

1
Questa risposta necessita di espansione perché non risponde alle domande del PO su what to do after calculating the PCAo how do I reduce my dataset exactly? Dato che l'OP ha condotto PCA sul suo campione, la sua domanda è: cosa farne e cosa succede effettivamente con questo sottocampione; non come fare PCA. Potremmo anche proporre di fare E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorsper ottenere un altro modo per ottenere anche i punteggi (che è in realtà ciò che fa Principin stats:::princomp.default).
usεr11852 dice Reinstate Monic il

1
@ user11852 - la domanda fa specificamente riferimento alla riduzione del set di dati (ovvero il troncamento che ho dimostrato qui). Lascio a lui decidere se questo era quello che stava cercando.
Marc nella scatola

1
@Marc, grazie per la risposta. Penso che potrei aver bisogno di fare un passo indietro e rileggere tutto di nuovo, perché sono bloccato su come una qualsiasi delle risposte sopra riguarda la riduzione della dimensionalità. Perché come mostri, dim (trunc) = dim (Xt). Qual è stato il vantaggio, le dimensioni non si sono ridotte.
B_Miner,

2
@B_Miner: tieni presente che il troncamento viene utilizzato per concentrarsi sugli schemi principali nei dati e per filtrare gli schemi e il rumore su piccola scala. I dati troncati non sono più piccoli in termini di dimensioni, ma "più puliti". Tuttavia, il troncamento riduce la quantità di dati in quanto l'intera matrice può essere ricostruita con pochi vettori. Un bell'esempio è l'uso del PCA per la compressione delle immagini, in cui un numero inferiore di PC può essere utilizzato per ricostruire l'immagine. Questo sottoinsieme più piccolo di vettori occupa meno memoria, ma la ricostruzione avrà qualche perdita nei dettagli su piccola scala.
Marc nella scatola

3

Queste altre risposte sono molto buone e dettagliate, ma mi chiedo se in realtà stai ponendo una domanda molto più semplice: cosa fai una volta che hai i tuoi PC?

Ogni PC diventa semplicemente una nuova variabile. Supponiamo che PC1 rappresenti il ​​60% della variazione totale e PC2 rappresenti il ​​30%. Dato che è il 90% della variazione totale spiegata, potresti semplicemente prendere queste due nuove variabili (PC) come una versione semplificata delle tue variabili originali. Ciò significa adattarli ai modelli, se è quello che ti interessa. Quando arriva il momento di interpretare i risultati, lo fai nel contesto delle variabili originali che sono correlate a ciascun PC.

Scusate se ho sottovalutato la portata della domanda!


2

ioλioΣK=1pλKpp=784λ

Praticamente con PCA stai usando le proiezioni dei PC (i "punteggi") come dati surrogati per il tuo campione originale. Fai tutte le tue analisi sui punteggi, e successivamente ricostruisci il tuo campione originale usando i PC per scoprire cosa è successo nel tuo spazio originale (che è fondamentalmente la regressione dei componenti principali ). Chiaramente, se sei in grado di interpretare in modo significativo i tuoi autovettori ("caricamenti"), allora sei in una posizione ancora migliore: puoi descrivere cosa succede al tuo campione nella modalità di variazione presentata da quel caricamento facendo deduzione su quel caricamento direttamente e non importa affatto della ricostruzione. :)

In generale cosa "dopo aver calcolato il PCA" dipende dall'obiettivo della tua analisi. PCA ti fornisce solo un sottocampione linearmente indipendente dei tuoi dati, che è l'ottimale in base a un criterio di ricostruzione RSS. Potresti usarlo per la classificazione, o la regressione, o entrambi, o come ho già detto, potresti voler riconoscere modi significativi di variazioni ortogonali nel tuo campione.

Un commento : penso che il modo più ingenuo per decidere il numero di componenti da conservare sia quello di basare la stima su una soglia di variazione del campione che si desidera conservare nel campione di dimensionalità ridotta piuttosto che solo su un numero arbitrario, ad es. 3, 100, 200. Come spiegato dall'utente4959, è possibile verificare tale variazione cumulativa controllando il relativo campo dell'elenco sotto il $loadingscampo nell'oggetto elenco prodotto da princomp.


1
Come menzionate Regressione dei componenti principali, in R fornito dal pacchetto pls. Per quanto riguarda il numero di componenti da conservare, non vedo alcun vantaggio reale nel decidere la varianza% rispetto a no. di componenti (forse perché lavoro con dati con livelli di rumore molto diversi. Come cita @ Marc-in-the-box, ci sono molti approcci diversi per determinare un numero di PC appropriato e la strategia sarà ( dovrebbe) dipendere sia dal tipo di dati che dal tipo di analisi dei dati da seguire.
cbeleites supporta Monica il

plsprincomp {stats}KKDD

1
si, è ingenuo. Non sono d'accordo sul fatto che l'impostazione di una% arbitraria della varianza spiegata abbia un vantaggio intrinseco rispetto a qualsiasi altra soglia arbitraria. Ma non vale comunque la pena di lottare su questo come a) l'OP non ha mai chiesto consigli sulla scelta del no. dei PC da mantenere eb) Penso che siamo d'accordo sul fatto che un'ispezione adeguata del modello PCA dovrebbe essere fatta comunque.
cbeleites supporta Monica il

Nessun problema; era solo un commento che avevo fatto prima della mia risposta. (
Metterò il

0

Dopo aver eseguito il PCA, è possibile selezionare i primi due componenti e il grafico. È possibile visualizzare la variazione dei componenti utilizzando un diagramma ghiaione in R. Inoltre, utilizzando la funzione di riepilogo con loadings = T, è possibile definire le variazioni delle funzioni con i componenti.

Puoi anche consultare questo http://www.statmethods.net/advstats/factor.html e http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf

Prova a pensare quello che vuoi. È possibile interpretare molte cose dall'analisi PCA.

Il miglior Abhik

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.