これはバグではありません。
コメントで(広範囲に)検討したように、2つのことが起こっています。1つ目は、の列がSVD要件を満たすように制約されていることです。各列は単位長さを持ち、他のすべての列と直交している必要があります。を特定のSVDアルゴリズムを介してランダム行列から作成されたランダム変数として見ると、これらの機能的に独立した制約がの列間に統計的依存性を作成することに注意してください。うんうんバツk (k + 1 )/ 2うん
これらの依存関係は、コンポーネント間の相関関係を研究することによって多かれ少なかれ明らかにされるかもしれない、しかし第二の現象が現れる:SVD溶液が一意でありません。少なくとも、各列は独立して否定でき、列の少なくとも異なる解を与えます。列の符号を適切に変更することにより、強い相関(を超える)を誘発できます。(これを行う1つの方法は、このスレッドのAmoebaの答えに対する最初のコメントで与えられています。すべてのを強制します。うんU 2 k個の K 1 / 2 、U 、I 、I、iは= 1 、... 、Kうん2kk1 / 2あなたは私私、i = 1 、… 、k一方、すべての相関は、等しい確率でランダムに独立して符号を選択することにより、消失するように作成できます。(以下の例を「編集」セクションに示します。)
の成分の散布図行列を読み取るときに、注意してこれらの現象を部分的に識別することができます。明確に定義された円形領域内にほぼ均一に分布するポイントの外観など、特定の特性は、独立性に欠けています。明確な非ゼロ相関を示す散布図など、その他は明らかにアルゴリズムで行われた選択に依存しますが、そのような選択は、そもそも独立性がないためにのみ可能です。うん
SVD(またはコレスキー、LR、LUなど)のような分解アルゴリズムの究極のテストは、それが主張することを行うかどうかです。この状況では、SVDは、行列の三重返すときことを確認すればよいことを、製品により、最大予想浮動小数点エラーに、回収された。および列が正規直交であること。また、は対角であり、その対角要素は負ではなく、降順で配置されます。私はそのようなテストをアルゴリズムに適用しました(U,D,V)XUDV′UVDsvd
R
そして、それがエラーであることを発見したことはありません。それは完全に正しいという保証ではありませんが、そのような経験-私は非常に多くの人々が共有していると信じています-バグが顕在化するためには何らかの異常な入力が必要になると示唆しています。
以下は、質問で提起された特定のポイントのより詳細な分析です。
R
のsvd
手順を使用すると、最初に、が増加するにつれての係数間の相関が弱くなることを確認できますが、それらはまだゼロではありません。 単純に大規模なシミュレーションを実行する場合、それらは重要であることがわかります。(場合、50000回の反復で十分です。)問題のアサーションとは反対に、相関は「完全に消えない」わけではありません。kUk = 3k=3
第二に、この現象を研究するより良い方法は、係数の独立性の基本的な質問に戻ることです。ほとんどの場合、相関はゼロに近い傾向がありますが、独立性の欠如は明らかです。 これは、の係数の完全な多変量分布を調べることで最も明らかになります。分布の性質は、ゼロではない相関が(まだ)検出できない小さなシミュレーションでも現れます。たとえば、係数の散布図行列を調べます。これは実用的にするために、私は、各シミュレートされたデータセットのサイズを設定と維持、それによって描画の実現をU4k=210004×2U 1000 × 8 U行列、行列を作成します。内の位置によって変数がリストされた完全な散布図行列を以下に示します。U1000×8U
最初の列ダウンスキャンする興味深い間の独立性の欠如を明らかと他の:と散布の上部象限方法を見、例えば、ほぼ空です。または(u 11、u 22)の関係を表す楕円の上向きの雲と(u 21、u 12)ペアの下向きの傾きの雲を調べます。 よく見ると、これらの係数のほとんどすべてに独立性がないことが明らかです。u11uiju21(u11,u22)(u21,u12) それらのほとんどは、ほとんどゼロの相関を示しますが、ほとんど独立しています。
(注:円形の雲のほとんどは、各列のすべてのコンポーネントの平方和を強制的に正規化する条件によって作成された超球からの投影です。)
k=3とk=4散布図行列は同様のパターンを示します。これらの現象はk=2限定されず、各シミュレーションデータセットのサイズにも依存しません。生成および検査が難しくなります。
これらのパターンの説明は、特異値分解でUを取得するために使用されるアルゴリズムに行きますが、Uの非常に明確なプロパティによって、このような非独立のパターンが存在する必要があることを知っています。 1つは、これらの直交性条件が係数間に機能的な依存関係を課し、それにより対応するランダム変数間の統計的依存関係に変換されます。U
編集
コメントに応えて、これらの依存現象が(SVDを計算するために)基礎となるアルゴリズムをどの程度反映しているか、およびプロセスの性質にどれだけ内在しているかに注目する価値があります。
特定の係数間の相関のパターンは、SVDアルゴリズムによって作ら任意選択に大いに依存の列:溶液が一意でないため、U常に独立に乗じてもよい−1、または1。記号を選択する固有の方法はありません。したがって、2つのSVDアルゴリズムは符号の異なる(任意またはおそらくはランダムな)選択を行う際に、彼らは、散布の異なるパターンをもたらすことができる(uij,ui′j′)の値。これを見たい場合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,jとui,j′間に現れる均一な円形の形状)。
元の散布図の一部の象限(上の図を参照)にデータがないことは、R
SVDアルゴリズムが列の符号を選択する方法に起因します。
結論については何も変わりません。U の2番目の列は最初の列と直交しているため(多変量確率変数と見なされます)、最初の列(多変量確率変数とも見なされます)に依存します。1つの列のすべてのコンポーネントを他の列のすべてのコンポーネントから独立させることはできません。できることは、依存関係をあいまいにする方法でデータを調べることだけですが、依存関係は持続します。
以下はR
、k>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=".")