Cómo realizar una reducción de dimensionalidad con PCA en R

30

Tengo un gran conjunto de datos y quiero realizar una reducción de dimensionalidad.

Ahora, en todas partes, leo que puedo usar PCA para esto. Sin embargo, todavía parece que no sé qué hacer después de calcular / realizar el PCA. En R esto se hace fácilmente con el comando princomp.

¿Pero qué hacer después de calcular el PCA? Si decidí que quiero usar los primeros componentes principales, ¿cómo reduzco exactamente mi conjunto de datos?100

Floris Devriendt
fuente
Esta pregunta no es muy clara (100 PC son su conjunto de datos de dimensionalidad reducida), pero específicamente sobre la reconstrucción de las variables originales (el tema de la respuesta aceptada) vea también: ¿Cómo revertir PCA y reconstruir variables originales a partir de varios componentes principales?
ameba dice Reinstate Monica

Respuestas:

35

Creo que a lo que se refiere en su pregunta se refiere al truncamiento de datos utilizando un número menor de componentes principales (PC). Para tales operaciones, creo que la función prcompes más ilustrativa ya que es más fácil visualizar la multiplicación de matrices utilizada en la reconstrucción.

Primero, proporcione un conjunto de datos sintético, Xtrealice la PCA (normalmente centraría las muestras para describir las PC relacionadas con una matriz de 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)

En los resultados o prcomp, puede ver las PC ( res$x), los valores propios ( res$sdev) que proporcionan información sobre la magnitud de cada PC y las cargas ( res$rotation).

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

Al cuadrar los valores propios, obtienes la varianza explicada por cada PC:

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

Finalmente, puede crear una versión truncada de sus datos utilizando solo las PC principales (importantes):

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)

Puede ver que el resultado es una matriz de datos ligeramente más uniforme, con características de pequeña escala filtradas:

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

ingrese la descripción de la imagen aquí

Y aquí hay un enfoque muy básico que puede hacer fuera de la función 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

Ahora, decidir qué PC retener es una pregunta separada, una que me interesó hace un tiempo . Espero que ayude.

Marc en la caja
fuente
2
Marc, no necesitas registrar el centro y escalar explícitamente, lo prcomphace por ti. Echa un vistazo a res$centery res$scale. En mi humilde opinión, es menos propenso a errores al usar estos (no hay diferencia accidental sobre centrar o no / escalar o no entre la llamada explícita scaley la prcompllamada).
cbeleites apoya a Monica el
1
Esta respuesta necesita expansión porque no responde las preguntas del OP sobre what to do after calculating the PCAo how do I reduce my dataset exactly? Dado que el OP ha llevado a cabo PCA en su muestra, su pregunta es qué hacer con ella y qué sucede con estas submuestras; no cómo hacer PCA. También podríamos proponer hacerlo E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorspara obtener otra forma de obtener las puntuaciones también (que en realidad es lo que hace princomp stats:::princomp.default).
usεr11852 dice Reinstate Monic el
1
@ user11852: la pregunta hace referencia específicamente a la reducción del conjunto de datos (es decir, el truncamiento que he demostrado aquí). Le dejaré a él decidir si esto era o no lo que estaba buscando.
Marc en la caja el
1
@ Marc, gracias por la respuesta. Creo que podría necesitar dar un paso atrás y volver a leer todo nuevamente, porque estoy atascado en cómo cualquiera de las respuestas anteriores trata con la reducción de la dimensionalidad. Porque como muestra, dim (trunc) = dim (Xt). Cuál fue el beneficio de esto, las dimensiones no se redujeron.
B_Miner
2
@B_Miner: solo tenga en cuenta que el truncamiento se utiliza para centrarse en los patrones principales en los datos y para filtrar los patrones y el ruido a pequeña escala. Los datos truncados no son más pequeños en términos de dimensiones, sino "más limpios". Sin embargo, el truncamiento reduce la cantidad de datos, ya que toda la matriz se puede reconstruir con solo unos pocos vectores. Un buen ejemplo es el uso de PCA para la compresión de imágenes, donde se puede usar un número menor de PC para reconstruir la imagen. Este subconjunto más pequeño de vectores ocupa menos memoria, pero la reconstrucción tendrá alguna pérdida en detalles a pequeña escala.
Marc en la caja
3

Estas otras respuestas son muy buenas y detalladas, pero me pregunto si realmente estás haciendo una pregunta mucho más básica: ¿qué haces una vez que tienes tus PC?

Cada PC simplemente se convierte en una nueva variable. Digamos que PC1 representa el 60% de la variación total y PC2 representa el 30%. Como eso representa el 90% de la variación total, simplemente podría tomar estas dos nuevas variables (PC) como una versión simplificada de sus variables originales. Esto significa adaptarlos a los modelos, si eso es lo que le interesa. Cuando llega el momento de interpretar sus resultados, lo hace en el contexto de las variables originales que están correlacionadas con cada PC.

Lo siento si he subestimado el alcance de la pregunta.

atrichornis
fuente
2

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

Prácticamente con PCA está utilizando las proyecciones de las PC (los "puntajes") como datos sustitutos para su muestra original. Usted hace todo su análisis de los puntajes, y luego reconstruye su muestra original nuevamente usando las PC para averiguar qué sucedió en su espacio original (eso es básicamente la Regresión del componente principal ). Claramente, si eres capaz de interpretar tus vectores propios ("cargas"), entonces estás en una posición aún mejor: puedes describir lo que le sucede a tu muestra en el modo de variación presentado por esa carga haciendo inferencia en esa carga directamente y No me importa la reconstrucción en absoluto. :)

En general, qué "después de calcular el PCA" depende del objetivo de su análisis. PCA simplemente le brinda una submuestra linealmente independiente de sus datos que es la óptima bajo un criterio de reconstrucción RSS. Puede usarlo para clasificación, regresión, o ambos, o como mencioné, es posible que desee reconocer modos ortogonales significativos de variaciones en su muestra.

Un comentario : creo que la mejor manera ingenua de decidir el número de componentes a retener es basar su estimación en algún umbral de variación de la muestra que le gustaría retener en su muestra de dimensionalidad reducida en lugar de solo un número arbitrario, por ejemplo. 3, 100, 200. Como explicó el usuario 4959, puede verificar esa variación acumulativa marcando el campo relevante de la lista debajo del $loadingscampo en el objeto de lista producido por princomp.

usεr11852 dice Reinstate Monic
fuente
1
Como menciona la regresión del componente principal, en R que es proporcionada por el paquete pls. En cuanto a la cantidad de componentes a retener, no veo ninguna ventaja real de decidir el% de varianza sobre el no. de componentes (tal vez sea porque trabajo con datos que tienen niveles de ruido muy diferentes. Como menciona @ Marc-in-the-box, hay muchos enfoques diferentes para determinar un número apropiado de PC, y la estrategia ( debería) depender tanto del tipo de datos como del tipo de análisis de datos que se va a seguir
cbeleites apoya a Monica el
plsprincomp {stats}KKDD
1
Sí, es ingenuo. No estoy de acuerdo en que establecer un porcentaje arbitrario de varianza explicada tenga una ventaja intrínseca de cualquier otro corte arbitrario. Pero de todos modos no vale la pena luchar por esto, ya que a) el OP nunca pidió consejo sobre cómo elegir el no. de PC para mantener yb) Creo que estamos de acuerdo en que una inspección adecuada del modelo de PCA debe hacerse de todos modos.
cbeleites apoya a Monica el
No hay problema; fue solo un comentario que hice antes de mi respuesta de todos modos. (Pondré el párrafo de mi comentario al final ya que creo que deja perplejo en lugar de aclarar lo que quiero decir)
usεr11852 dice Reinstate Monic el
0

Después de hacer el PCA, puede seleccionar los dos primeros componentes y trazar. Puede ver la variación de los componentes usando un diagrama de pantalla en R. También usando la función de resumen con cargas = T puede encontrar la variación de características con los componentes.

También puede consultar este http://www.statmethods.net/advstats/factor.html y http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf

Trata de pensar lo que quieres. Puede interpretar muchas cosas del análisis de PCA.

Best Abhik

usuario4959
fuente