疎データに基づく共分散行列の固有およびsvd分解が異なる結果をもたらすのはなぜですか?


12

スパース/ギャップのあるデータセットに基づいて共分散行列を分解しようとしています。で計算されたラムダ(説明された分散)の合計が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

1
PSあなたが私を理解したことを願っています:固有値の合計は、covのトレース(対角合計)に等しくなければなりません。マトリックス。ただし、SVDは、一部の固有値が負になる可能性があるという事実に「盲目的」です。SVDが非グラビアンcovの分解に使用されることはほとんどありません。マトリックス、通常は、既知のグラミアン(正の半正定値)マトリックスまたは生データで使用されます
ttnphns

1
@ttnphns-ご意見ありがとうございます。svd固有値の形状が異なる場合の結果についてはそれほど心配しないと思います。その結果、明らかに、後続の固有値が必要以上に重要になっています。
ボックス内のマーク

回答:


4

固有値の絶対値の合計、つまりsum(abs(Eg $ values))を実行し、それを特異値の合計と比較する必要があります。彼らは等しいでしょう。

1

この美しい定理の逆の証明は、プリンストン大学(現在はラトガース)の回転双曲面の代数、Javier F. Cabrera、線形代数とその応用に現れました。

これを推論する別の方法は、sqrt(eigen(t(Cg)%*%Cg))がCgの特異値に等しいという事実によるものです。ただし、固有値が負の場合、データは複素平面を考慮したエルミート形式で表現する必要があります。これは、元の定式では見逃されたものです。つまり、負の固有の行列の対称平方根値には複雑なエントリがあります。


1
この説明に感謝します。私はeigenとsvdの関係を知っていましたが、元のマトリックスを分解する際の上記の違いを考えると、それらがまだ関連していることを知りませんでした。ちょうど好奇心が強い-私が知る限り、行列が「正定」でない場合、固有分解は負の値を与えます。これは、ギャップのあるデータに基づくすべての共分散行列の場合ですか?
ボックス内のマーク

1
Marc、実対称行列の正定性は、すべての正固有値を持つことに相当します。「ギャップのあるデータ」と密接な関係はありません。これは、多数のゼロエントリを持つスパース行列を意味することを理解しています。結局のところ、非特異行列(対称または非対称)の中で最もまばらなのは対角行列であり、その固有値をエントリとして示します。
whuber

@whuber-コメントありがとうございます。この場合、非値はNaNであり、0(ゼロ)ではないという点で、「ギャップ」を「スパース」とは異なって解釈します。したがって、共分散値は、共通値の数でスケーリングされます(つまり、n-1で除算されます)。その点で、共分散行列に実際にゼロが含まれているとは思わない。
ボックス内のマーク

1
そのような欠落データから共分散行列を推定する方法を見つけることも課題です。私はずっと前に同様の質問をし、刺激的な答えを受け取りました。
whuber

:私は経験的直交関数で使用するために対象の私の関心に起草追加の質問(EOF)解析ここに求めているstats.stackexchange.com/questions/34832/...
ボックスにマークを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.