Ich versuche, eine Kovarianzmatrix zu zerlegen, die auf einem dünn besetzten Datensatz basiert. Ich bemerke, dass die Summe von Lambda (erklärte Varianz), wie sie mit berechnet svd
wird, mit zunehmend unsteten Daten verstärkt wird. Ohne Lücken, svd
und eigen
die gleichen Ergebnisse yeild.
Dies scheint bei einer eigen
Zersetzung nicht zu passieren . Ich hatte mich für svd
Lambda entschieden , weil die Lambda-Werte immer positiv sind, aber diese Tendenz ist besorgniserregend. Gibt es eine Art von Korrektur, die angewendet werden muss, oder sollte ich svd
für ein solches Problem ganz vermeiden .
###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 in der Kiste
quelle
quelle
svd
wenn es nicht die unterschiedliche Form der Eigenwerte gäbe. Das Ergebnis ist offensichtlich, dass den nachgestellten Eigenwerten mehr Bedeutung beigemessen wird, als es sollte.Antworten:
Sie müssen die Summe des Absolutwerts der Eigenwerte, dh der Summe (abs (z. B. $ -Werte)), erstellen und mit der Summe der Singularwerte vergleichen. Sie würden gleich sein.
Der Beweis für die Umkehrung dieses schönen Theorems erschien in der Algebra der Hyperboloide der Revolution, Javier F. Cabrera, Lineare Algebra und ihre Anwendungen, Princeton University (jetzt bei Rutgers).
Eine andere Möglichkeit, dies zu begründen, ist die Tatsache, dass sqrt (eigen (t (Cg)% *% Cg)) gleich den Singularwerten von Cg ist. Wenn die Eigenwerte jedoch negativ sind, müssen die Daten in einer hermitischen Form dargestellt werden, wobei die komplexe Ebene berücksichtigt wird, was in der ursprünglichen Formulierung übersehen wurde, dh die Daten, die durch die symmetrische Quadratwurzel der Matrix mit negativem Eigen gebildet werden Werte hätten komplexe Einträge.
quelle