R 和 MATLAB 中不同的 SVD 结果
Different SVD result in R and MATLAB
我是 R 的新手,正在尝试矩阵的 SVD。当我用 MATLAB 交叉检查时,SVD 的 V 矩阵显示出不同的结果。有没有我遗漏的解释,或者我在 R 编程中做错了什么。以下是 R 和 MATLAB 的屏幕截图。然而U和D矩阵相似
结论是一样的
那么,为什么这些矩阵看起来不一样呢?
回想一下 SVD 如何将矩阵分解为 UΣV*。
矩阵的维度分别为m x m、m x n、n x n。
但是,Σ是对角矩阵,只需要max(m,n)维就可以表示矩阵
完成此缩减后,U 或 V* 将缩减维度,具体取决于 m 和 n 的大小。例如,在这种情况下,Σ 可以简化为 3 x 3 矩阵,而 V* 将是 3 x 4 矩阵。
最后,可以问一下这种减少是否会导致信息丢失。但是,矩阵的"missing part"可以从它们是酉矩阵的事实中恢复出来。
svd
可以接受 nu
和 nv
参数指定要发出的 U
和 V
的大小。这些默认为 min(# of rows, # of cols)
,这意味着在 R 中默认情况下 SVD 是“瘦”或 economy-mode SVD,而 Matlab 默认为完整 SVD,除非您要求瘦版本。
以下是获取完整 V
的方法:S = svd(M, nu=3, nv=4)
。更一般地说,nu=nrow(M)
和 nv=ncol(M)
.
完整示例:
> M = matrix(c(2,3,4,5,1,2,3,4,0,1,2,3), nrow=3, ncol=4)
> M
[,1] [,2] [,3] [,4]
[1,] 2 5 3 1
[2,] 3 1 4 2
[3,] 4 2 0 3
> S = svd(M, nu=3, nv=4)
> S$u
[,1] [,2] [,3]
[1,] 0.6486710 0.63810301 0.4147897
[2,] 0.5607706 -0.03225566 -0.8273427
[3,] 0.5145506 -0.76927506 0.3787527
> S$d
[1] 8.790352 3.524115 2.882763
> S$v
[,1] [,2] [,3] [,4]
[1,] 0.5731120 -0.5384787 -0.04767577 -0.61588176
[2,] 0.5498331 0.4596073 0.69520488 0.05598925
[3,] 0.4765560 0.5065914 -0.71632725 0.05598925
[4,] 0.3769888 -0.4921046 -0.03595079 0.78384952
在这种情况下,Matlab 和 R SVD 匹配! (通常它们不需要匹配,因为 U
和 V
的任何旋转也是 SVD。)
我是 R 的新手,正在尝试矩阵的 SVD。当我用 MATLAB 交叉检查时,SVD 的 V 矩阵显示出不同的结果。有没有我遗漏的解释,或者我在 R 编程中做错了什么。以下是 R 和 MATLAB 的屏幕截图。然而U和D矩阵相似
结论是一样的
那么,为什么这些矩阵看起来不一样呢?
回想一下 SVD 如何将矩阵分解为 UΣV*。
矩阵的维度分别为m x m、m x n、n x n。
但是,Σ是对角矩阵,只需要max(m,n)维就可以表示矩阵
完成此缩减后,U 或 V* 将缩减维度,具体取决于 m 和 n 的大小。例如,在这种情况下,Σ 可以简化为 3 x 3 矩阵,而 V* 将是 3 x 4 矩阵。
最后,可以问一下这种减少是否会导致信息丢失。但是,矩阵的"missing part"可以从它们是酉矩阵的事实中恢复出来。
svd
可以接受 nu
和 nv
参数指定要发出的 U
和 V
的大小。这些默认为 min(# of rows, # of cols)
,这意味着在 R 中默认情况下 SVD 是“瘦”或 economy-mode SVD,而 Matlab 默认为完整 SVD,除非您要求瘦版本。
以下是获取完整 V
的方法:S = svd(M, nu=3, nv=4)
。更一般地说,nu=nrow(M)
和 nv=ncol(M)
.
完整示例:
> M = matrix(c(2,3,4,5,1,2,3,4,0,1,2,3), nrow=3, ncol=4)
> M
[,1] [,2] [,3] [,4]
[1,] 2 5 3 1
[2,] 3 1 4 2
[3,] 4 2 0 3
> S = svd(M, nu=3, nv=4)
> S$u
[,1] [,2] [,3]
[1,] 0.6486710 0.63810301 0.4147897
[2,] 0.5607706 -0.03225566 -0.8273427
[3,] 0.5145506 -0.76927506 0.3787527
> S$d
[1] 8.790352 3.524115 2.882763
> S$v
[,1] [,2] [,3] [,4]
[1,] 0.5731120 -0.5384787 -0.04767577 -0.61588176
[2,] 0.5498331 0.4596073 0.69520488 0.05598925
[3,] 0.4765560 0.5065914 -0.71632725 0.05598925
[4,] 0.3769888 -0.4921046 -0.03595079 0.78384952
在这种情况下,Matlab 和 R SVD 匹配! (通常它们不需要匹配,因为 U
和 V
的任何旋转也是 SVD。)