Saya mencoba untuk menguraikan matriks kovarians berdasarkan pada set data yang jarang / gappy. Saya memperhatikan bahwa jumlah lambda (dijelaskan varians), sebagaimana dihitung dengan svd
, sedang diperkuat dengan data yang semakin gappy. Tanpa celah, svd
dan eigen
hasil yang sama.
Ini sepertinya tidak terjadi dengan eigen
dekomposisi. Saya telah condong ke arah penggunaan svd
karena nilai-nilai lambda selalu positif, tetapi kecenderungan ini mengkhawatirkan. Apakah ada semacam koreksi yang perlu diterapkan, atau haruskah saya hindari svd
sama sekali untuk masalah seperti itu.
###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")
r
svd
eigenvalues
Marc di dalam kotak
sumber
sumber
svd
jika bukan karena bentuk nilai eigen yang berbeda. Hasilnya jelas memberikan nilai eigen yang lebih penting daripada yang seharusnya.Jawaban:
Anda perlu melakukan penjumlahan dari nilai absolut nilai eigen yaitu, penjumlahan (abs (nilai $)) dan membandingkannya dengan penjumlahan dari nilai singular. Mereka akan sama.
Alasannya adalah bahwa jika Anda mengalikan baris atau kolom yang sesuai dengan nilai eigen negatif dengan , maka nilai eigen dari matriks baru menjadi positif dan ortogonalitas vektor eigen tidak terganggu.−1
Bukti kebalikan dari teorema yang indah ini muncul dalam Aljabar hiperboloid revolusi, Javier F. Cabrera, Aljabar Linier dan Penerapannya, Universitas Princeton (sekarang di Rutgers).
Cara lain untuk alasan ini adalah dengan fakta bahwa sqrt (eigen (t (Cg)% *% Cg)) sama dengan nilai singular Cg. Tetapi ketika nilai eigen negatif, data harus diwakili dalam bentuk hermitian dengan bidang kompleks diperhitungkan, yang merupakan apa yang terlewatkan dalam formulasi asli, yaitu data yang dibentuk oleh akar kuadrat simetris dari matriks dengan eigen negatif nilai akan memiliki entri yang kompleks.
sumber