আমি বিশ্বাস করি যে আপনার প্রশ্নে আপনি যা অর্জন করছেন তা অল্প সংখ্যক অধ্যক্ষ উপাদান (পিসি) ব্যবহার করে ডেটা ট্রাঙ্কেশন সম্পর্কিত। এই জাতীয় ক্রিয়াকলাপগুলির জন্য, আমি মনে করি যে ফাংশনটি 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()
এবং এখানে একটি খুব প্রাথমিক পদ্ধতি যা আপনি প্রম্পম্প ফাংশনের বাইরে করতে পারেন:
#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
এখন, কোন পিসি ধরে রাখতে হবে তা সিদ্ধান্ত নেওয়া পৃথক প্রশ্ন - এমন একটি যা আমি কিছুক্ষণ আগে আগ্রহী ছিল । আশা করি এইটি কাজ করবে.