スパース/ギャップのあるデータセットに基づいて共分散行列を分解しようとしています。で計算されたラムダ(説明された分散)の合計がsvd
、ますますギャップのあるデータで増幅されていることに気付きました。隙間なく、svd
かつeigen
同じ結果をyeild。
これはeigen
分解では発生しないようです。svd
ラムダ値は常に正であるため、私は使用に傾いていましたが、この傾向は心配です。適用する必要がある何らかの修正がありますか、またはsvd
このような問題を完全に回避する必要がありますか?
###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がわかりません)が、ここに1つまたは2つの概念があります。負の固有値は、covの固有分解に現れる可能性があります。生データに多くの欠損値があり、covの計算時にそれらがペアで削除された場合の行列。そのような行列のSVDは、これらの負の固有値を正と誤解して報告します。あなたの写真は、固有値とsvd分解の両方が、負の値に関する違いだけでなく、同様に(正確に同じでない場合)動作することを示しています。
—
ttnphns
PSあなたが私を理解したことを願っています:固有値の合計は、covのトレース(対角合計)に等しくなければなりません。マトリックス。ただし、SVDは、一部の固有値が負になる可能性があるという事実に「盲目的」です。SVDが非グラビアンcovの分解に使用されることはほとんどありません。マトリックス、通常は、既知のグラミアン(正の半正定値)マトリックスまたは生データで使用されます
—
ttnphns
@ttnphns-ご意見ありがとうございます。
—
ボックス内のマーク
svd
固有値の形状が異なる場合の結果についてはそれほど心配しないと思います。その結果、明らかに、後続の固有値が必要以上に重要になっています。