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, svd
et eigen
obtenez les mêmes résultats.
Cela ne semble pas se produire avec une eigen
décomposition. J'avais tendance à utiliser svd
car 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 svd
complè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")
r
svd
eigenvalues
Marc dans la boîte
la source
la source
svd
sans la forme différente des valeurs propres. Le résultat donne évidemment plus d'importance aux valeurs propres de fin qu'il ne devrait.Réponses:
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.
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.
la source