9

Octave と R を使用して、単純な行列を使用して SVD を計算し、2 つの異なる答えを得ています。コードを以下に示します。

R

> a<-matrix(c(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1), 9, 4)
> a
 [,1] [,2] [,3] [,4]
 [1,]    1    1    0    0
 [2,]    1    1    0    0
 [3,]    1    1    0    0
 [4,]    1    0    1    0
 [5,]    1    0    1    0
 [6,]    1    0    1    0
 [7,]    1    0    0    1
 [8,]    1    0    0    1
 [9,]    1    0    0    1
> a.svd <- svd(a)
> a.svd$d
[1] 3.464102e+00 1.732051e+00 1.732051e+00 1.922963e-16
> a.svd$u
       [,1]       [,2]          [,3]          [,4]
 [1,] -0.3333333  0.4714045 -1.741269e-16  7.760882e-01
 [2,] -0.3333333  0.4714045 -3.692621e-16 -1.683504e-01
 [3,] -0.3333333  0.4714045 -5.301858e-17 -6.077378e-01
 [4,] -0.3333333 -0.2357023 -4.082483e-01  6.774193e-17
 [5,] -0.3333333 -0.2357023 -4.082483e-01  6.774193e-17
 [6,] -0.3333333 -0.2357023 -4.082483e-01  6.774193e-17
 [7,] -0.3333333 -0.2357023  4.082483e-01  5.194768e-17
 [8,] -0.3333333 -0.2357023  4.082483e-01  5.194768e-17
 [9,] -0.3333333 -0.2357023  4.082483e-01  5.194768e-17
> a.svd$v
      [,1]       [,2]          [,3] [,4]
[1,] -0.8660254  0.0000000 -4.378026e-17  0.5
[2,] -0.2886751  0.8164966 -2.509507e-16 -0.5
[3,] -0.2886751 -0.4082483 -7.071068e-01 -0.5
[4,] -0.2886751 -0.4082483  7.071068e-01 -0.5

オクターブ

octave:32> a = [ 1, 1, 1, 1, 1, 1, 1, 1, 1; 1, 1, 1, 0, 0, 0, 0, 0, 0; 0, 0, 0, 1, 1, 1, 0, 0, 0; 0, 0, 0, 0, 0, 0, 1, 1, 1 ]
a =

  1   1   1   1   1   1   1   1   1
  1   1   1   0   0   0   0   0   0
  0   0   0   1   1   1   0   0   0
  0   0   0   0   0   0   1   1   1

octave:33> [u, s, v] = svd (a)
u =

 -8.6603e-01  -1.0628e-16   2.0817e-17  -5.0000e-01
 -2.8868e-01   5.7735e-01  -5.7735e-01   5.0000e-01
 -2.8868e-01  -7.8868e-01  -2.1132e-01   5.0000e-01
 -2.8868e-01   2.1132e-01   7.8868e-01   5.0000e-01

s =

Diagonal Matrix

 3.4641e+00            0            0            0            0
          0   1.7321e+00            0            0            0
          0            0   1.7321e+00            0            0
          0            0            0   3.7057e-16            0
          0            0            0            0            0

v =

 -3.3333e-01   3.3333e-01  -3.3333e-01   7.1375e-01
 -3.3333e-01   3.3333e-01  -3.3333e-01  -1.3472e-02
 -3.3333e-01   3.3333e-01  -3.3333e-01  -7.0027e-01
 -3.3333e-01  -4.5534e-01  -1.2201e-01  -9.0583e-17
 -3.3333e-01  -4.5534e-01  -1.2201e-01   2.0440e-17
 -3.3333e-01  -4.5534e-01  -1.2201e-01   2.0440e-17
 -3.3333e-01   1.2201e-01   4.5534e-01   8.3848e-17
 -3.3333e-01   1.2201e-01   4.5534e-01   8.3848e-17
 -3.3333e-01   1.2201e-01   4.5534e-01   8.3848e-17

私は Octave と R の両方に慣れていないので、最初の質問は、これを正しく行っているかということです。もしそうなら、どれが「正しい」ですか?どちらも正しいですか?また、numpy でこれを試し、LAPACK 関数 dgesdd および dgesvd を直接呼び出しました。Numpy は Octave に似た答えをくれ、LAPACK 関数を呼び出すと R に似た答えが返ってきます。

ありがとう!

4

2 に答える 2

8

SVD 分解では、$A=UDV^T$ のみが一意です (並べ替えまで)。$cU$ と $\frac{1}{c}V$ が同じ分解を行うことは、多かれ少なかれ簡単にわかります。したがって、異なるアルゴリズムが異なる結果をもたらすことは驚くべきことではありません。重要なのは、すべてのアルゴリズムで $D$ が同じでなければならないということです。

于 2011-05-09T11:06:51.030 に答える
2

実際、U と V も一意の特異値に対して一意です。あなたがそうでない理由は、特異値2と3が繰り返されているためです。特異値 1 (3.4) は一意であるため、U と V の列 1 は両方の回答で同じです。

また、列 2 と列 3 は一意ではありませんが、両方の回答に対して同じ線形部分空間にある必要があります。これは、U1 が最初の U の列 2 と 3 で構成され、U2 が 2 番目の U の列 2 と 3 で構成されている場合、U1'*U2 は、両方の列が単位 (ユークリッド) であるフル ランクの 2x2 行列でなければならないことを意味します。マグニチュード。

于 2012-12-13T10:44:40.687 に答える