Perché le decomposizioni eigen e svd di una matrice di covarianza basata su dati sparsi producono risultati diversi?


12

Sto cercando di scomporre una matrice di covarianza basata su un set di dati sparsi / vuoti. Sto notando che la somma di lambda (spiegazione della varianza), calcolata con svd, viene amplificata con dati sempre più vuoti. Senza lacune svde eigenottieni gli stessi risultati.

Ciò non sembra accadere con una eigendecomposizione. Mi ero orientato verso l'uso svdperché i valori lambda sono sempre positivi, ma questa tendenza è preoccupante. C'è una sorta di correzione che deve essere applicata o dovrei evitare del svdtutto per un tale problema.

###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")

inserisci qui la descrizione dell'immagine


Mi dispiace di non essere in grado di seguire il tuo codice (non conosco R), ma ecco una o due nozioni. Autovalori negativi possono apparire nella decomposizione degli automi di una cov. matrice se i dati non elaborati presentavano molti valori mancanti e quelli venivano eliminati in modo saggio durante il calcolo del cov. SVD di tale matrice riporterà (in modo fuorviante) quegli autovalori negativi come positivi. Le tue immagini mostrano che sia le decomposizioni di Eigen che quelle di svd si comportano in modo simile (se non esattamente uguale) oltre a quella unica differenza relativa ai valori negativi.
ttnphns,

1
PS Spero tu mi abbia capito: la somma degli autovalori deve essere uguale alla traccia (somma diagonale) della cov. matrice. Tuttavia, SVD è "cieco" al fatto che alcuni autovalori potrebbero essere negativi. SVD è raramente usato per scomporre la cov non gramiana. matrice, viene generalmente utilizzato con una matrice consapevolmente gramiana (semidefinito positivo) o con dati grezzi
ttnphns

1
@ttnphns - Grazie per la tua comprensione. Immagino che non sarei così preoccupato per il risultato dato svdse non fosse per la diversa forma degli autovalori. Il risultato ovviamente sta dando più importanza agli autovalori finali di quanto dovrebbe.
Marc nella scatola

Risposte:


4

Devi fare la somma del valore assoluto dei valori di autovene cioè sum (abs (es. Valori $)) e confrontarlo con la somma dei valori singolari. Sarebbero uguali.

Il motivo è che se moltiplichi le righe o le colonne che corrispondono agli autovalori negativi per , allora il valore di autovalore della nuova matrice diventa positivo e l'ortogonalità degli autovettori non viene disturbata.1

La prova del contrario di questo bellissimo teorema è apparsa in L'algebra degli iperboloidi della rivoluzione, Javier F. Cabrera, Linear Algebra and its Applications, Princeton University (ora a Rutgers).

Un altro modo di ragionare è che sqrt (eigen (t (Cg)% *% Cg)) sono uguali ai valori singolari di Cg. Ma quando gli autovalori sono negativi, i dati devono essere rappresentati in una forma eremitica tenendo conto del piano complesso, che è ciò che è stato perso nella formulazione originale, cioè i dati formati dalla radice quadrata simmetrica della matrice con autovelox negativo i valori avrebbero voci complesse.


1
molte grazie per questa spiegazione. Ero a conoscenza della relazione tra eigen e svd, ma non ero a conoscenza del fatto che sarebbero stati ancora correlati, date le differenze sopra menzionate nel decomporre la matrice originale. Solo curioso - per quanto ne so, una decomposizione di autovì darà valori negativi quando una matrice non è "definita positiva". È questo il caso di tutte le matrici di covarianza basate su dati gappy?
Marc nella scatola il

1
Marc, la positività positiva di una matrice simmetrica reale equivale ad avere tutti gli autovalori positivi. Non esiste una relazione stretta con "dati gappy", comprendendo che ciò significa matrici sparse con molte voci zero. Dopotutto, le matrici non singolari (simmetriche o no) sono le più rare tra quelle diagonali, che mostrano i loro autovalori come voci.
whuber

@whuber - grazie per il tuo commento. In questo caso, interpreto "gappy" in modo diverso da "sparse" in quanto i non-valori sono NaN e non 0 (zero). Pertanto, i valori di covarianza vengono ridimensionati in base al numero di valori comuni (ovvero divisi per n-1). A tale proposito, non credo che la matrice di covarianza contenesse effettivamente degli zeri.
Marc nella scatola il

1
Trovare un modo anche per stimare la matrice di covarianza da tali dati mancanti è una sfida: ho fatto una domanda simile molto tempo fa e ho ricevuto alcune risposte stimolanti.
whuber

Ho fatto una domanda aggiuntiva elaborando il mio interesse per l'argomento per l'uso nell'analisi della funzione ortogonale empirica (EOF) qui: stats.stackexchange.com/questions/34832/…
Marc nella casella
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.