Saya percaya apa yang Anda maksudkan dalam pertanyaan Anda berkaitan dengan pemotongan data menggunakan sejumlah kecil komponen utama (PC). Untuk operasi seperti itu, saya pikir fungsinya prcomp
lebih ilustratif karena lebih mudah untuk memvisualisasikan perkalian matriks yang digunakan dalam rekonstruksi.
Pertama, berikan dataset sintetis Xt
,, Anda melakukan PCA (biasanya Anda akan memusatkan sampel untuk menggambarkan PC terkait dengan matriks kovarians:
#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)
Di hasil atau prcomp
, Anda dapat melihat PC ( res$x
), nilai eigen ( res$sdev
) yang memberikan informasi tentang besarnya masing-masing PC, dan pemuatan ( res$rotation
).
res$sdev
length(res$sdev)
res$rotation
dim(res$rotation)
res$x
dim(res$x)
Dengan mengkuadratkan nilai eigen, Anda mendapatkan perbedaan yang dijelaskan oleh setiap PC:
plot(cumsum(res$sdev^2/sum(res$sdev^2))) #cumulative explained variance
Terakhir, Anda dapat membuat versi data terpotong dengan hanya menggunakan PC terkemuka (penting):
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)
Anda dapat melihat bahwa hasilnya adalah matriks data yang sedikit lebih halus, dengan fitur skala kecil disaring:
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()
Dan berikut ini adalah pendekatan yang sangat mendasar yang dapat Anda lakukan di luar fungsi 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
Sekarang, memutuskan PC mana yang akan dipertahankan adalah pertanyaan terpisah - yang saya tertarik beberapa waktu lalu . Semoga itu bisa membantu.