मैं एक विरल / गैपी डेटा सेट के आधार पर एक सहसंयोजक मैट्रिक्स को विघटित करने की कोशिश कर रहा हूं। मैं देख रहा हूँ कि लैम्ब्डा (समझाया गया विचरण) का योग, जैसा कि गणना svd
की जा रही है, तेजी से गप्पी डेटा के साथ प्रवर्धित किया जा रहा है। अंतराल के बिना, svd
और eigen
समान परिणाम प्राप्त करें।
यह एक eigen
अपघटन के साथ नहीं लगता है । मैं प्रयोग करने की ओर झुकाव गया था svd
क्योंकि लैंबडा मूल्य हमेशा सकारात्मक होते हैं, लेकिन यह प्रवृत्ति चिंताजनक है। क्या कुछ प्रकार का सुधार है जिसे लागू करने की आवश्यकता है, या मुझे svd
इस तरह की समस्या से पूरी तरह से बचना चाहिए ।
###Make complete and gappy data set
set.seed(1)
x <- 1:100
y <- 1:100
grd <- expand.grid(x=x, y=y)
#complete data
z <- matrix(runif(dim(grd)[1]), length(x), length(y))
image(x,y,z, col=rainbow(100))
#gappy data
zg <- replace(z, sample(seq(z), length(z)*0.5), NaN)
image(x,y,zg, col=rainbow(100))
###Covariance matrix decomposition
#complete data
C <- cov(z, use="pair")
E <- eigen(C)
S <- svd(C)
sum(E$values)
sum(S$d)
sum(diag(C))
#gappy data (50%)
Cg <- cov(zg, use="pair")
Eg <- eigen(Cg)
Sg <- svd(Cg)
sum(Eg$values)
sum(Sg$d)
sum(diag(Cg))
###Illustration of amplification of Lambda
set.seed(1)
frac <- seq(0,0.5,0.1)
E.lambda <- list()
S.lambda <- list()
for(i in seq(frac)){
zi <- z
NA.pos <- sample(seq(z), length(z)*frac[i])
if(length(NA.pos) > 0){
zi <- replace(z, NA.pos, NaN)
}
Ci <- cov(zi, use="pair")
E.lambda[[i]] <- eigen(Ci)$values
S.lambda[[i]] <- svd(Ci)$d
}
x11(width=10, height=5)
par(mfcol=c(1,2))
YLIM <- range(c(sapply(E.lambda, range), sapply(S.lambda, range)))
#eigen
for(i in seq(E.lambda)){
if(i == 1) plot(E.lambda[[i]], t="n", ylim=YLIM, ylab="lambda", xlab="", main="Eigen Decomposition")
lines(E.lambda[[i]], col=i, lty=1)
}
abline(h=0, col=8, lty=2)
legend("topright", legend=frac, lty=1, col=1:length(frac), title="fraction gaps")
#svd
for(i in seq(S.lambda)){
if(i == 1) plot(S.lambda[[i]], t="n", ylim=YLIM, ylab="lambda", xlab="", main="Singular Value Decomposition")
lines(S.lambda[[i]], col=i, lty=1)
}
abline(h=0, col=8, lty=2)
legend("topright", legend=frac, lty=1, col=1:length(frac), title="fraction gaps")
svd
eigenvalues के विभिन्न आकार के लिए नहीं थे , तो मैं इस परिणाम के बारे में चिंतित नहीं होता । परिणाम स्पष्ट रूप से अनुगामी eigenvalues को अधिक महत्व देना चाहिए।