मुझे विश्वास है कि आप अपने प्रश्न पर क्या प्राप्त कर रहे हैं, मुख्य घटक (पीसी) की एक छोटी संख्या का उपयोग करके डेटा ट्रंकेशन की चिंता करता है। इस तरह के संचालन के लिए, मुझे लगता है कि फ़ंक्शन prcomp
अधिक उदाहरण में है कि पुनर्निर्माण में उपयोग किए गए मैट्रिक्स गुणन की कल्पना करना आसान है।
सबसे पहले, एक सिंथेटिक डेटासेट दें, Xt
आप पीसीए का प्रदर्शन करते हैं (आमतौर पर आप एक कोवेरियन मैट्रिक्स से संबंधित पीसी का वर्णन करने के लिए नमूनों को केंद्र में रखते हैं:
#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)
परिणामों में या prcomp
, आप पीसी के ( res$x
), ईजेनवेल्यूज़ ( res$sdev
) प्रत्येक पीसी के परिमाण पर जानकारी देते हुए, और लोडिंग ( res$rotation
) देख सकते हैं।
res$sdev
length(res$sdev)
res$rotation
dim(res$rotation)
res$x
dim(res$x)
आइगेनवैल्यूज़ को चुकता करके, आपको प्रत्येक पीसी द्वारा समझाया गया विचरण मिलता है:
plot(cumsum(res$sdev^2/sum(res$sdev^2))) #cumulative explained variance
अंत में, आप केवल प्रमुख (महत्वपूर्ण) पीसी का उपयोग करके अपने डेटा का एक छोटा संस्करण बना सकते हैं:
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)
आप देख सकते हैं कि परिणाम थोड़ा चिकना डेटा मैट्रिक्स है, जिसमें छोटे पैमाने पर फीचर्स फ़िल्टर किए गए हैं:
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()
और यहाँ एक बहुत ही बुनियादी तरीका है जिसे आप 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
अब, यह तय करना कि कौन से पीसी को बनाए रखना एक अलग सवाल है - एक जिसे मैं कुछ समय पहले दिलचस्पी ले रहा था । उम्मीद है की वो मदद करदे।