【问题标题】:Any reason why Octave, R, Numpy and LAPACK yield different SVD results on the same matrix?为什么 Octave、R、Numpy 和 LAPACK 在同一个矩阵上产生不同的 SVD 结果?
【发布时间】:2011-08-21 14:37:42
【问题描述】:

我正在使用 Octave 和 R 使用一个简单的矩阵计算 SVD,并得到两个不同的答案!代码如下:

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 的答案。

谢谢!

【问题讨论】:

    标签: r numpy octave lapack svd


    【解决方案1】:

    在 SVD 分解中,$A=UDV^T$ 只有 $D$ 是唯一的(直到重新排序)。或多或少容易看出 $cU$ 和 $\frac{1}{c}V$ 将给出相同的分解。因此,不同的算法可以给出不同的结果也就不足为奇了。重要的是所有算法的 $D$ 必须相同。

    【讨论】:

    • @mpiktas (+1) 他,他:这里不支持 TeX :-(
    • 只有当您采用其对角线条目按降序排序的约定时,D 才唯一确定。
    • @Sven,是的,当然,但是如果你比较两组数字,不同的排序似乎比不同的值问题更小。我将编辑答案以反映您的评论。
    • 另一个问题是数值准确性,即 1e-16 数量级的数字实际上为零。
    • @mpiktas 不。啊,是的,这是一个有意为之的功能,旨在鼓励您在 {maths|stats}.SE 上做出贡献 :-)
    【解决方案2】:

    实际上,对于唯一奇异值,U 和 V 也是唯一的。你不是的原因是奇异值 2 和 3 重复了。奇异值 1(3.4)是唯一的 - 因此 U 和 V 的第 1 列在两个答案中是相同的。

    此外,即使第 2 列和第 3 列不是唯一的,它们也应该位于两个答案的相同线性子空间中。这意味着如果 U1 由第一个 U 的第 2 列和第 3 列组成,并且 U2 由第二个 U 的第 2 列和第 3 列组成,则 U1'*U2 应该是一个满秩 2x2 矩阵,其列都是单位(欧几里得)幅度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多