SAS/IML 和 R 在 SVD 分解中的不同结果
Different result from SAS/IML and R, in SVD decomposition
不久,我正在将一个 R 包翻译成 IML 语言,我完全在为 R 和 IML 之间的 SVD 分解结果而苦苦挣扎。
R代码:
s <- svd(MAT)
s$v
SAS/IML代码:
call svd (U, D, V, MAT);
print V;
V 是包含来自 SVD 分解的右奇异向量的矩阵的两侧,但是在这里,请看一下 R 的这些结果:
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] -2.625059e-02 0.029572211 -0.006491235 0.015622547 0.01553215 -0.003882378 0.007250290
[2,] -4.762146e-06 -0.030403155 -0.016635218 0.024949110 -0.01238686 0.001334805 0.041902431
[3,] -8.460010e-02 0.025365547 0.006657322 0.020129575 -0.02312842 0.038366880 0.054249177
[4,] -1.368302e-02 0.029621706 0.005462163 0.017887163 0.02605000 -0.002546119 -0.001913554
[5,] -3.326751e-02 0.003552646 0.003634580 0.065277891 -0.01218518 -0.026305833 0.029209961
[6,] -1.451836e-02 0.089992653 -0.012355758 0.009777273 -0.07790069 -0.044679172 -0.028174261
这些结果来自 SAS/IML:
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9
ROW1 0.0262506 -0.029572 -0.006491 0.0156225 0.0155322 -0.003882 -0.00725 0.040721 -0.000566
ROW2 4.7621E-6 0.0304032 -0.016635 0.0249491 -0.012387 0.0013348 -0.041902 0.0225321 0.0070566
ROW3 0.0846001 -0.025366 0.0066573 0.0201296 -0.023128 0.0383669 -0.054249 0.0305745 -0.041534
ROW4 0.013683 -0.029622 0.0054622 0.0178872 0.02605 -0.002546 0.0019136 0.0168932 0.0229999
ROW5 0.0332675 -0.003553 0.0036346 0.0652779 -0.012185 -0.026306 -0.02921 -0.029533 0.0145009
ROW6 0.0145184 -0.089993 -0.012356 0.0097773 -0.077901 -0.044679 0.0281743 -0.025475 -0.036881
ROW7 -0.012385 0.0295035 0.0051056 -0.0007 0.0025335 -0.009391 -0.045927 -0.054661 -0.029963
数值和你看到的一样,只是它们的符号时而相同时而不同。我找不到发生这种情况的任何原因,这完全让我发疯。
有人可以给我一个解决方案,或者至少是一个提示或任何东西。
任何帮助将不胜感激,即使它不能解决此问题。
非常感谢。
编辑:显然,发布的结果只是总矩阵的一部分。
简而言之,SVD分解不是唯一的。
M的奇异向量是M`M的特征向量。特征向量不是唯一的。即使矩阵满秩,特征向量也只定义到一个符号:如果 v 是特征值 lambda 的矩阵 A 的特征向量,那么 -v 也是,因为
A*(-v) = -(Av) = -(lambda v) = lambda (-v).
不同的 SVD(和特征值)算法可能导致不同的分解。只要 M = UDV`,分解就有效。奇异值的 D 矩阵在各个软件包中基本相同,但 U 和 V 矩阵可以不同。
顺便说一下,如果您的矩阵不是满秩的,那么 "uniqueness up to sign" 也会崩溃。 The Wikipedia article on the SVD 有一个例子,对于同一个秩亏矩阵,有两个非常不同的 SVD。
不久,我正在将一个 R 包翻译成 IML 语言,我完全在为 R 和 IML 之间的 SVD 分解结果而苦苦挣扎。
R代码:
s <- svd(MAT)
s$v
SAS/IML代码:
call svd (U, D, V, MAT);
print V;
V 是包含来自 SVD 分解的右奇异向量的矩阵的两侧,但是在这里,请看一下 R 的这些结果:
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] -2.625059e-02 0.029572211 -0.006491235 0.015622547 0.01553215 -0.003882378 0.007250290
[2,] -4.762146e-06 -0.030403155 -0.016635218 0.024949110 -0.01238686 0.001334805 0.041902431
[3,] -8.460010e-02 0.025365547 0.006657322 0.020129575 -0.02312842 0.038366880 0.054249177
[4,] -1.368302e-02 0.029621706 0.005462163 0.017887163 0.02605000 -0.002546119 -0.001913554
[5,] -3.326751e-02 0.003552646 0.003634580 0.065277891 -0.01218518 -0.026305833 0.029209961
[6,] -1.451836e-02 0.089992653 -0.012355758 0.009777273 -0.07790069 -0.044679172 -0.028174261
这些结果来自 SAS/IML:
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9
ROW1 0.0262506 -0.029572 -0.006491 0.0156225 0.0155322 -0.003882 -0.00725 0.040721 -0.000566
ROW2 4.7621E-6 0.0304032 -0.016635 0.0249491 -0.012387 0.0013348 -0.041902 0.0225321 0.0070566
ROW3 0.0846001 -0.025366 0.0066573 0.0201296 -0.023128 0.0383669 -0.054249 0.0305745 -0.041534
ROW4 0.013683 -0.029622 0.0054622 0.0178872 0.02605 -0.002546 0.0019136 0.0168932 0.0229999
ROW5 0.0332675 -0.003553 0.0036346 0.0652779 -0.012185 -0.026306 -0.02921 -0.029533 0.0145009
ROW6 0.0145184 -0.089993 -0.012356 0.0097773 -0.077901 -0.044679 0.0281743 -0.025475 -0.036881
ROW7 -0.012385 0.0295035 0.0051056 -0.0007 0.0025335 -0.009391 -0.045927 -0.054661 -0.029963
数值和你看到的一样,只是它们的符号时而相同时而不同。我找不到发生这种情况的任何原因,这完全让我发疯。 有人可以给我一个解决方案,或者至少是一个提示或任何东西。 任何帮助将不胜感激,即使它不能解决此问题。
非常感谢。
编辑:显然,发布的结果只是总矩阵的一部分。
简而言之,SVD分解不是唯一的。
M的奇异向量是M`M的特征向量。特征向量不是唯一的。即使矩阵满秩,特征向量也只定义到一个符号:如果 v 是特征值 lambda 的矩阵 A 的特征向量,那么 -v 也是,因为 A*(-v) = -(Av) = -(lambda v) = lambda (-v).
不同的 SVD(和特征值)算法可能导致不同的分解。只要 M = UDV`,分解就有效。奇异值的 D 矩阵在各个软件包中基本相同,但 U 和 V 矩阵可以不同。
顺便说一下,如果您的矩阵不是满秩的,那么 "uniqueness up to sign" 也会崩溃。 The Wikipedia article on the SVD 有一个例子,对于同一个秩亏矩阵,有两个非常不同的 SVD。