Pourquoi les décompositions propres et svd d'une matrice de covariance basées sur des données clairsemées donnent-elles des résultats différents?

12

J'essaie de décomposer une matrice de covariance basée sur un ensemble de données clairsemé / gappy. Je remarque que la somme de lambda (variance expliquée), telle que calculée avec svd, est amplifiée avec des données de plus en plus pertinentes. Sans lacunes, svdet eigenobtenez les mêmes résultats.

Cela ne semble pas se produire avec une eigendécomposition. J'avais tendance à utiliser svdcar les valeurs lambda sont toujours positives, mais cette tendance est inquiétante. Y a-t-il une sorte de correction qui doit être appliquée, ou devrais-je éviter svdcomplètement pour un tel problème.

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

entrez la description de l'image ici

Marc dans la boîte
la source
Je suis désolé de ne pas pouvoir suivre votre code (je ne connais pas R), mais voici une ou deux notions. Des valeurs propres négatives peuvent apparaître lors de la décomposition propre d'une cov. matrice si les données brutes avaient de nombreuses valeurs manquantes et celles-ci ont été supprimées par paire lors du calcul de la cov. La SVD d'une telle matrice rapportera (de manière trompeuse) ces valeurs propres négatives comme positives. Vos images montrent que les décompositions propres et svd se comportent de manière similaire (sinon exactement la même), en plus de cette seule différence concernant les valeurs négatives.
ttnphns
1
PS J'espère que vous m'avez compris: la somme des valeurs propres doit être égale à la trace (somme diagonale) de la cov. matrice. Cependant, SVD est "aveugle" au fait que certaines valeurs propres peuvent être négatives. La SVD est rarement utilisée pour décomposer la cov non-gramian. matrice, elle est généralement utilisée soit avec une matrice sciemment gramian (semi-définie positive) ou avec des données brutes
ttnphns
1
@ttnphns - Merci pour votre perspicacité. Je suppose que je ne serais pas aussi inquiet du résultat donné par svdsans la forme différente des valeurs propres. Le résultat donne évidemment plus d'importance aux valeurs propres de fin qu'il ne devrait.
Marc dans la case du

Réponses:

4

Vous devez faire la somme de la valeur absolue des valeurs propres, c'est-à-dire la somme (abs (par exemple valeurs $)) et la comparer avec la somme des valeurs singulières. Ils seraient égaux.

-1

La preuve de l'inverse de ce beau théorème est apparue dans The algebra of hyperboloids of revolution, Javier F. Cabrera, Linear Algebra and its Applications, Princeton University (maintenant à Rutgers).

Une autre façon de raisonner cela est le fait que sqrt (eigen (t (Cg)% *% Cg)) est égal aux valeurs singulières de Cg. Mais lorsque les valeurs propres sont négatives, les données doivent être représentées sous une forme hermitienne avec le plan complexe pris en compte, ce qui était manquant dans la formulation d'origine, c'est-à-dire les données formées par la racine carrée symétrique de la matrice à valeur propre négative les valeurs auraient des entrées complexes.

corbillard
la source
1
merci beaucoup pour cette explication. J'étais conscient de la relation entre eigen et svd, mais je ne savais pas qu'ils seraient toujours liés étant donné les différences susmentionnées dans la décomposition de la matrice d'origine. Juste curieux - pour autant que je sache, une décomposition propre donnera des valeurs négatives quand une matrice n'est pas "définie positive". Est-ce le cas avec toutes les matrices de covariance basées sur des données gappy?
Marc dans la boite
1
Marc, la définition positive d'une matrice symétrique réelle équivaut à avoir toutes les valeurs propres positives. Il n'y a pas de relation étroite avec les «données gappy», sachant que cela signifie des matrices clairsemées avec de nombreuses entrées nulles. Après tout, les plus rares parmi les matrices non singulières (symétriques ou non) sont les diagonales, qui présentent leurs valeurs propres comme entrées.
whuber
@whuber - merci pour votre commentaire. Dans ce cas, j'interprète "gappy" différemment de "clairsemé" en ce que les non-valeurs sont NaNs et non 0 (zéro). Ainsi, les valeurs de covariance sont mises à l'échelle par le nombre de valeurs communes (c'est-à-dire divisées par n-1). À cet égard, je ne pense pas que la matrice de covariance contienne réellement des zéros.
Marc dans la boite
1
Trouver un moyen même d'estimer la matrice de covariance à partir de ces données manquantes est un défi: j'ai posé une question similaire il y a longtemps et j'ai reçu des réponses stimulantes.
whuber
J'ai posé une question supplémentaire expliquant
Marc dans la boîte du