Mengapa dekomposisi eigen dan svd dari matriks kovarians didasarkan pada data yang jarang menghasilkan hasil yang berbeda?

12

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, svddan eigenhasil yang sama.

Ini sepertinya tidak terjadi dengan eigendekomposisi. Saya telah condong ke arah penggunaan svdkarena nilai-nilai lambda selalu positif, tetapi kecenderungan ini mengkhawatirkan. Apakah ada semacam koreksi yang perlu diterapkan, atau haruskah saya hindari svdsama 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")

masukkan deskripsi gambar di sini

Marc di dalam kotak
sumber
Maaf karena tidak dapat mengikuti kode Anda (tidak tahu R), tetapi inilah satu atau dua gagasan. Nilai eigen negatif dapat muncul dalam dekomposisi eigen dari cov. matriks jika data mentah memiliki banyak nilai yang hilang dan itu dihapus berpasangan saat menghitung cov. SVD dari matriks seperti itu akan melaporkan (menyesatkan) nilai-nilai eigen negatif sebagai positif. Gambar Anda menunjukkan bahwa dekomposisi eigen dan svd berperilaku sama (jika tidak persis sama) selain itu hanya ada perbedaan mengenai nilai negatif.
ttnphns
1
PS Harap Anda mengerti saya: jumlah nilai eigen harus sama dengan jejak (jumlah diagonal) dari cov. matriks. Namun, SVD "buta" terhadap kenyataan bahwa beberapa nilai eigen mungkin negatif. SVD jarang digunakan untuk menguraikan cov non-gram. matrix, ini biasanya digunakan baik dengan sadar gramian (semidefinite positif) matriks atau dengan data mentah
ttnphns
1
@ttnphns - Terima kasih atas wawasan Anda. Saya kira saya tidak akan terlalu khawatir tentang hasil yang diberikan svdjika bukan karena bentuk nilai eigen yang berbeda. Hasilnya jelas memberikan nilai eigen yang lebih penting daripada yang seharusnya.
Marc di dalam kotak

Jawaban:

4

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.

mobil jenazah
sumber
1
terima kasih banyak atas penjelasan ini. Saya menyadari hubungan antara eigen dan svd, tetapi tidak menyadari bahwa mereka masih akan terkait mengingat perbedaan yang disebutkan di atas dalam penguraian matriks asli. Hanya ingin tahu - sejauh yang saya tahu, dekomposisi eigen akan memberikan nilai negatif ketika sebuah matriks tidak "pasti positif". Apakah ini yang terjadi dengan semua matriks kovarians berdasarkan data gappy?
Marc di dalam kotak
1
Marc, kepastian positif dari matriks simetris nyata setara dengan memiliki semua nilai eigen positif. Tidak ada hubungan dekat dengan "data gappy," memahami bahwa itu berarti matriks jarang dengan banyak entri nol. Bagaimanapun, yang paling jarang di antara matriks nonsingular (simetris atau tidak) adalah yang diagonal, yang menunjukkan nilai eigen mereka sebagai entri mereka.
whuber
@whuber - terima kasih atas komentar Anda. Dalam hal ini, saya menafsirkan "gappy" secara berbeda menjadi "jarang" dalam arti bahwa nilai-nilainya adalah NaNs dan bukan 0 (nol). Dengan demikian nilai-nilai kovarians diskalakan dengan jumlah nilai-nilai umum (yaitu dibagi dengan n-1). Dalam hal itu, saya tidak percaya bahwa matriks kovarians sebenarnya mengandung nol.
Marc di dalam kotak
1
Menemukan cara bahkan untuk memperkirakan matriks kovarians dari data yang hilang tersebut adalah sebuah tantangan: Saya mengajukan pertanyaan serupa di masa lalu dan menerima beberapa jawaban yang merangsang.
Whuber
Saya telah mengajukan pertanyaan tambahan yang menguraikan minat saya pada subjek untuk digunakan dalam analisis Fungsi Orthogonal Empiris (EOF) di sini: stats.stackexchange.com/questions/34832/…
Marc di dalam kotak