32 votos

¿Cómo reconstruir los datos originales utilizando un pequeño número de componentes principales?

Yo tengo un gran conjunto de datos de $\pm 40000$ observaciones, cada una conteniendo $784$ variables. Debido a este conjunto de datos es muy grande quiero realizar una reducción de dimensionalidad.

Ahora en todas partes he leído que puedo usar el PCA para esto. Sin embargo, yo todavía no parecen tener qué hacer después de calcular/realización de la PCA. En el R esto se hace fácilmente con el comando princomp.

Pero, ¿qué hacer después de calcular la PCA? Si decidí que desea utilizar la primera $100$ de componentes principales, ¿cómo puedo reducir mis datos exactamente?

38voto

Jake Puntos 3853

Yo creo que lo que usted está consiguiendo en su pregunta se refiere al truncamiento de los datos utilizando un número menor de componentes principales (PC). Para este tipo de operaciones, creo que la función prcompes más ilustrativa en la que es más fácil visualizar la multiplicación de la matriz utilizada en la reconstrucción.

En primer lugar, una síntesis de conjunto de datos, Xt, de llevar a cabo la PCA (normalmente, usted tendría que centrar las muestras con el fin de describir PC relativas a 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, se puede ver la PC (res$x), los valores propios (res$sdev), dando 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)

Elevando al cuadrado los valores propios, se obtiene la varianza explicada por cada PC:

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

Por último, puede crear una versión truncada de sus datos mediante el uso de sólo el líder (importante) PCs:

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)

Se puede ver que el resultado es un poco más suave matriz de datos, a pequeña escala las características de filtrado:

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

enter image description here

Y aquí es un enfoque básico que usted puede hacer fuera de la prcomp función:

#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é equipos a retener es otra cuestión - a la que yo estaba interesado en un tiempo. Espero que ayude.

3voto

Tim Puntos 499

Estas otras respuestas son muy buenos y detallados, pero me pregunto si en realidad estás pidiendo una cuestión más: ¿qué hacer si usted tiene tu Pc?

Cada PC simplemente se convierte en una nueva variable. Decir PC1 representa el 60 % de la variación total y la PC2 representa el 30 %. Como que el 90 % de la variación total explicada, usted podría simplemente tomar estas dos nuevas variables (PCs) como una versión simplificada de su original de variables. Esto significa adaptación a los modelos, si eso es lo que le interesa. Cuando llega la hora de interpretar sus resultados, puede hacerlo en el contexto de las variables originales que están correlacionados con cada PC.

Lo siento si he subestimado el alcance de la cuestión!

2voto

usεr11852 Puntos 5514

Creo que tu pregunta original proviene de ser un poco inseguro acerca de lo que la PCA está haciendo. Análisis de Componentes principales permite identificar el principal modo de variación de la muestra. Los modos son emperically calcula como los vectores propios de su muestra de la matriz de covarianza (las "cargas"). Posteriormente, los vectores de servir como el nuevo "sistema de coordenadas" de la muestra como el proyecto original de la muestra en el espacio que define (los "scores"). La proporción de la variación asociada con la $i$-ésimo vector propio/ en el modo de variación de/ carga/ principal componente es igual a $\frac{\lambda_i}{\Sigma_{k=1}^{p} \lambda_k}$ donde $p$ es la de la muestra original de la dimensionalidad ($p =784$ en su caso). [Recuerda que debido a que su matriz de covarianza es no negativa Definida que no tendrás ningún negativo autovalores $\lambda$.] Ahora, por definición, los vectores propios son ortogonales uno al otro. Eso significa que sus respectivas proyecciones también son ortogonales y donde originalmente había un gran posiblemente correlación de la muestra de las variables, ahora usted tiene un (esperemos significativamente menor linealmente independientes de la muestra (los "scores").

Prácticamente con PCA está utilizando las proyecciones de la Pc (el "scores") como sustituto de datos para su muestra original. Puedes hacer todo el análisis en los resultados, y luego reconstruir el original muestra de nuevo el uso de la Pc para averiguar lo que sucedió en su espacio original (que, básicamente, Principal Componente de Regresión). Claramente, si usted es capaz de significativa intérprete de sus vectores propios ("cargas"), entonces usted está en una posición aún mejor: Se puede describir lo que sucede a su muestra en el modo de variación presentados por que la carga por hacer inferencia sobre que carga directamente y no preocuparse de la reconstrucción. :)

En general, ¿qué "después de calcular el PCA" depende del objetivo del análisis. PCA sólo le da un linealmente independiente de la sub-muestra de datos que es el óptimo en un RSS reconstrucción criterio. Usted podría utilizar para la clasificación o regresión, o de ambos, o, como he mencionado, usted podría querer reconocer significativa ortogonal modos de variaciones en su muestra.

Un comentario : creo que la mejor ingenua manera de decidir el número de componentes a retener es la base de su estimación en algunos umbral de la muestra la variación desea conservar en su dimensionalidad reducida de la muestra en lugar de sólo algunos de número arbitrario, por ejemplo. 3, 100, 200. Como user4959 explicado puede comprobar que la variación acumulada mediante la comprobación en el campo correspondiente de la lista en virtud de la $loadingscampo en la lista de objetos producidos por princomp.

0voto

Marksu Teoren Puntos 33

Después de hacer el PCA, entonces usted puede seleccionar los dos primeros componentes y la trama.. Se puede ver la variación de los componentes por medio de un gráfico de sedimentación en R. También utilizando la función de resumen con cargas=T puede aletas de la variación de las características de los componentes.

También puede buscar en este http://www.statmethods.net/advstats/factor.html y http://statmath.wu.ac.at/~hornik/QFS1/principal_component viñeta.pdf

Trate de pensar lo que quiera. Se puede interpretar de muchas cosas de la PCA de análisis.

Mejor Abhik

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X