ランダムデータのSVD結果における奇妙な相関。彼らは数学的な説明を持っていますか、それはLAPACKのバグですか?


21

ランダムデータのSVD結果に非常に奇妙な動作が見られます。これは、MatlabとRの両方で再現できます。LAPACKライ​​ブラリの数値の問題のようです。それは...ですか?

平均がゼロで、共分散がゼロの次元ガウスからサンプルを描画します:。データ行列にアセンブルします。(オプションで中央に配置するかどうかは、以下に影響しません。)次に、特異値分解(SVD)を実行してを取得します。 2つの特定の要素、たとえばと取り上げて、異なる描画間でそれらの間の相関関係をみましょう。数字があれば、K = 2 X N0 I1000年× 2 X X X = U S VU U 11 U 22 X N個のR EのPn=1000k=2XN(0,I)1000×2XXX=USVUU11U22XNrep描画のは適度に大きいため、このような相関はすべてゼロに近いはずです(つまり、母集団の相関はゼロでなければならず、サンプルの相関は小さくなります)。

ただし、、、、および間で、これらの要素間でのみ、いくつかの奇妙な強い相関関係(約)が観察されます。他のすべての要素のペアには、予想どおりゼロ付近の相関があります。ここではどのようにするための相関行列20の「上部」の要素Uが\ mathbf(最初のように見える10個の、最初の列の要素、最初の10秒の列の要素)。U 11 U 12 U 21 U 22±0.2U11U12U21U22U 10 1020U1010

SVDの奇妙な相関

各象限の左上隅にある奇妙に高い値に注意してください。

この効果を私にもたらしたは、この@whuberのコメントでした。@whuberは、PC1とPC2は独立していないと主張し、その証拠としてこの強い相関関係を示しました。しかし、私の印象では、彼は偶然LAPACKライ​​ブラリの数値バグを発見しました。ここで何が起こっていますか?

@whuberのRコードは次のとおりです。

stat <- function(x) {u <- svd(x)$u; c(u[1,1], u[2, 2])};
Sigma <- matrix(c(1,0,0,1), 2);
sim <- t(replicate(1e3, stat(MASS::mvrnorm(10, c(0,0), Sigma))));
cor.test(sim[,1], sim[,2]);

Matlabのコードは次のとおりです。

clear all
rng(7)

n = 1000;     %// Number of variables
k = 2;        %// Number of observations
Nrep = 1000;  %// Number of iterations (draws)

for rep = 1:Nrep
    X = randn(n,k);
    %// X = bsxfun(@minus, X, mean(X));
    [U,S,V] = svd(X,0);

    t(rep,:) = [U(1:10,1)' U(1:10,2)'];
end

figure
imagesc(corr(t), [-.5 .5])
axis square
hold on
plot(xlim, [10.5 10.5], 'k')
plot([10.5 10.5], ylim, 'k')

n = 4およびk = 3を使用すると、相関も表示されます。
アクサカル

@Aksakal:はい、確かに、ありがとう。k = 2とk = 3の間の主張された違いを取り除くために編集しました。
アメーバは、モニカを復活させる

回答:


23

これはバグではありません。

コメントで(広範囲に)検討したように、2つのことが起こっています。1つ目は、の列がSVD要件を満たすように制約されていることです。各列は単位長さを持ち、他のすべての列と直交している必要があります。を特定のSVDアルゴリズムを介してランダム行列から作成されたランダム変数として見ると、これらの機能的に独立した制約がの列間に統計的依存性を作成することに注意してください。うんうんバツkk+1/2うん

これらの依存関係は、コンポーネント間の相関関係を研究することによって多かれ少なかれ明らかにされるかもしれない、しかし第二の現象が現れる:SVD溶液が一意でありません。少なくとも、各列は独立して否定でき、列の少なくとも異なる解を与えます。列の符号を適切に変更することにより、強い相関(を超える)を誘発できます。(これを行う1つの方法は、このスレッドのAmoebaの答えに対する最初のコメントで与えられてます。すべてのを強制します。うんU 2 k個の K 1 / 2 、U 、I 、Iiは= 1 ... Kうん2kk1/2あなたは=1k一方、すべての相関は、等しい確率でランダムに独立して符号を選択​​することにより、消失するように作成できます。(以下の例を「編集」セクションに示します。)

の成分の散布図行列を読み取るときに、注意してこれらの現象を部分的に識別することができます。明確に定義された円形領域内にほぼ均一に分布するポイントの外観など、特定の特性は、独立性に欠けています。明確な非ゼロ相関を示す散布図など、その他は明らかにアルゴリズムで行われた選択に依存しますが、そのような選択は、そもそも独立性がないためにのみ可能です。うん

SVD(またはコレスキー、LR、LUなど)のような分解アルゴリズムの究極のテストは、それが主張することを行うかどうかです。この状況では、SVDは、行列の三重返すときことを確認すればよいことを、製品により、最大予想浮動小数点エラーに、回収された。および列が正規直交であること。また、は対角であり、その対角要素は負ではなく、降順で配置されます。私はそのようなテストをアルゴリズムに適用しました(U,D,V)XUDVUVDsvdRそして、それがエラーであることを発見したことはありません。それは完全に正しいという保証ではありませんが、そのような経験-私は非常に多くの人々が共有していると信じています-バグが顕在化するためには何らかの異常な入力が必要になると示唆しています。

以下は、質問で提起された特定のポイントのより詳細な分析です。


Rsvd手順を使用すると、最初に、が増加するにつれての係数間の相関が弱くなることを確認できますが、それらはまだゼロではありません。 単純に大規模なシミュレーションを実行する場合、それらは重要であることがわかります。(場合、50000回の反復で十分です。)問題のアサーションとは反対に、相関は「完全に消えない」わけではありません。kUk = 3k=3

第二に、この現象を研究するより良い方法は、係数の独立性の基本的な質問に戻ることです。ほとんどの場合、相関はゼロに近い傾向がありますが、独立性の欠如は明らかです。 これは、の係数の完全な多変量分布を調べることで最も明らかになります。分布の性質は、ゼロではない相関が(まだ)検出できない小さなシミュレーションでも現れます。たとえば、係数の散布図行列を調べます。これは実用的にするために、私は、各シミュレートされたデータセットのサイズを設定と維持、それによって描画の実現をU4k=210004×2U 1000 × 8 U行列、行列を作成します。内の位置によって変数がリストされた完全な散布図行列を以下に示します。U1000×8U

図

最初の列ダウンスキャンする興味深い間の独立性の欠如を明らかと他の:と散布の上部象限方法を見、例えば、ほぼ空です。またはu 11u 22)の関係を表す楕円の上向きの雲とu 21u 12ペアの下向きの傾きの雲を調べます。 よく見ると、これらの係数のほとんどすべてに独立性がないことが明らかです。u11uiju21(u11,u22)(u21,u12) それらのほとんどは、ほとんどゼロの相関を示しますが、ほとんど独立しています。

(注:円形の雲のほとんどは、各列のすべてのコンポーネントの平方和を強制的に正規化する条件によって作成された超球からの投影です。)

k=3k=4散布図行列は同様のパターンを示します。これらの現象はk=2限定されず、各シミュレーションデータセットのサイズにも依存しません。生成および検査が難しくなります。

これらのパターンの説明は、特異値分解でUを取得するために使用されるアルゴリズムに行きますが、Uの非常に明確なプロパティによって、このような非独立のパターンが存在する必要があることを知っています。 1つは、これらの直交性条件が係数間に機能的な依存関係を課し、それにより対応するランダム変数間の統計的依存関係に変換されます。U


編集

コメントに応えて、これらの依存現象が(SVDを計算するために)基礎となるアルゴリズムをどの程度反映しているか、およびプロセスの性質にどれだけ内在しているかに注目する価値があります。

特定の係数間の相関のパターンは、SVDアルゴリズムによって作ら任意選択に大いに依存の列:溶液が一意でないため、U常に独立に乗じてもよい1、または1。記号を選択する固有の方法はありません。したがって、2つのSVDアルゴリズムは符号の異なる(任意またはおそらくはランダムな)選択を行う際に、彼らは、散布の異なるパターンをもたらすことができる(uij,uij)の値。これを見たい場合statは、以下のコードの関数を

stat <- function(x) {
  i <- sample.int(dim(x)[1]) # Make a random permutation of the rows of x
  u <- svd(x[i, ])$u         # Perform SVD
  as.vector(u[order(i), ])   # Unpermute the rows of u
}

これは、最初に観測値をランダムにx並べ替え、SVDを実行してuから、逆の順序付けを適用して元の観測シーケンスに一致させます。効果は元の散布図の反射バージョンと回転バージョンの混合物を形成するため、マトリックス内の散布図はより均一に見えます。すべてのサンプル相関はゼロに非常に近くなります(構造上、基礎となる相関は正確にゼロになります)。それにもかかわらず、独立性の欠如は依然として明白です(特にui,jui,j間に現れる均一な円形の形状)。

元の散布図の一部の象限(上の図を参照)にデータがないことは、RSVDアルゴリズムが列の符号を選択する方法に起因します。

結論については何も変わりません。U の2番目の列は最初の列と直交しているため(多変量確率変数と見なされます)、最初の列(多変量確率変数とも見なされます)に依存します。1つの列のすべてのコンポーネントを他の列のすべてのコンポーネントから独立させることはできません。できることは、依存関係をあいまいにする方法でデータを調べることだけですが、依存関係は持続します。


以下はRk>2の場合を処理し、散布図行列の一部を描画する更新されたコードです。

k <- 2    # Number of variables
p <- 4    # Number of observations
n <- 1e3  # Number of iterations
stat <- function(x) as.vector(svd(x)$u)
Sigma <- diag(1, k, k); Mu <- rep(0, k)
set.seed(17)
sim <- t(replicate(n, stat(MASS::mvrnorm(p, Mu, Sigma))))
colnames(sim) <- as.vector(outer(1:p, 1:k, function(i,j) paste0(i,",",j)))
pairs(sim[, 1:min(11, p*k)], pch=".")

3
の列の最初のコンポーネント間で相関関係が発生するのは、それがSVDアルゴリズムの仕組みだからです。Xの行がガウス分布であることは重要ではありません。Uの係数がガウス分布ではないことに気づいたと思います。UXU
whuber

2
ちなみに、私はただ単に交換することを発見したsvd(X,0)ことでsvds(X)、私のMatlabのコードでは効果が消えます!私の知る限り、これら2つの関数は異なるSVDアルゴリズムを使用しています(両方ともLAPACKルーチンですが、明らかに異なるものです)。Rは、MATLABのと同様の機能を持っているかどうかは知りませんsvdsが、あなたがしている場合、私は疑問に思って、まだそれは「本当の」効果ではなく、数値問題であることを維持するだろう。
アメーバは、モニカーを復活させる

4
紳士、ちょっと待って。なぜあなたはサインについて話さないのですか?固有ベクトルの符号は基本的に任意です。しかし、svdのプログラムはランダムに割り当てません。符号はsvdの実装とデータに依存します。抽出後に、U各列をそのままにするか、符号を変更するかをランダムに決定した場合、あなたが話している相関関係は消えませんか?
ttnphns

2
@ttnphnsそれは正しい、私の編集で説明したように。これにより相関関係は消滅しますが、Uの列間の依存関係はなくなりません。(提供された拡張バージョンは、列の符号をランダムに変更することと同等です。)Ustat
whuber

2
ちょっとしたポイント(この素晴らしいスレッドです!)SVDは、対角線の要素がS特定の順序であることを必要としません。それは利便性の問題です。他のルーチンはこれを保証します(例えば、MATLABのsvds)が、それは一般的な要件ではありません。@amoeba:(svdsこの問題のある振る舞いはないように見えます)を見ると、計算は実際に固有値を最初に計算することに基づいています(したがって、標準dgesdd/ dgesvdLAPACKルーチンを使用しません- 最初はdsyevr/ dsyevxを使用していると強く思います)。
usεr11852は回復モニック言う

11

この回答は、Matlabでの@whuberの結果の複製と、相関がSVD実装がコンポーネントの符号を選択​​する方法の「アーティファクト」であることの直接的なデモンストレーションを示します。

混乱を招く可能性のあるコメントの長いチェーンを考えると、将来の読者のために、以下に完全に同意することを強調したいと思います。

  1. この議論の文脈では、確かである確率変数。U
  2. 列の長さは1でなければなりません。これは、各列内の要素が独立していないことを意味します。それらの二乗の合計は1つになります。ただし、これは、i jの場合、U i 1U j 1の間の相関を意味するものではなく、ランダムなドローの数が多いN r e pの場合、サンプルの相関は小さいはずです。U1Ui1Uj1ijNrep
  3. 列は直交する必要があります。これは、異なる列の要素が独立していないことを意味します。それらの内積はゼロです。繰り返しますが、これはU i 1U j 2の間の相関を意味するものではなく、サンプルの相関は小さいはずです。UUi1Uj2

私の質問は:なぜ私たちは、高い相関関係を参照くださいランダム多数のためにもドローNのR用のE P = 1000年0.2Nrep=1000

Matlabでのk = 2、およびN r e p = 1000の @whuberの例の複製を以下に示します。n=4k=2Nrep=1000

SVD

左側は相関行列、右側は@whuberのような散布図です。シミュレーション間の合意は完璧なようです。

ここで、@ ttnphnsによる独創的な提案に従って、の列にランダムな記号を割り当てます。つまり、次の行の後です。U

[U,S,V] = svd(X,0);

次の2行を追加します。

U(:,1) = U(:,1) * sign(randn(1));
U(:,2) = U(:,2) * sign(randn(1));

結果は次のとおりです。

ランダムな符号を持つSVD

最初から期待したとおりに、すべての相関が消えます!

11

UU

PS。本日10万件の評判をいただき、@ whuberにおめでとうございます!


statstat <- function(x) { u <- svd(x)$u; as.vector(sign(runif(1) - 1/2)*u %*% diag(sign(diag(u)))) }U(u11,u22,,ukk)UU

svdssvdUU

R±2/30.2

1
U

1
直感的に、それは公平です。最初の主軸が空間で定義されるとすぐに、残りのpr。軸の自由度が低下します。2Dデータの場合、2番目の(最後の)PCは符号を除いて完全に結び付けられます。むしろ、統計的な意味での依存ではなく、制約と呼びます。
ttnphns

0

xy

x2+y2=1

Cov[x,y]=Var[xy]=E[x2y2]E[xy]2

xy


k(k+1)/2UUDUUDk(k1)/2

U1Unkn>kUnn=1000n=4x2+y2=1U

xUyx2+y2=1Cov(x,y)=0x=cos(θ)y=sin(θ)θ[0,2π)

UUij01/nnn1/n=1

1
UXU11U21ρnρρρ=0
アメーバは、モニカーを復活させる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.