当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R svd 矩阵的奇异值分解


R语言 svd 位于 base 包(package)。

说明

计算矩形矩阵的 singular-value 分解。

用法

svd(x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE)

La.svd(x, nu = min(n, p), nv = min(n, p))

参数

x

要计算其 SVD 分解的数值或复数矩阵。逻辑矩阵被强制转换为数字。

nu

要计算的左奇异向量的数量。这必须在 0n = nrow(x) 之间。

nv

要计算的右奇异向量的数量。它必须位于 0p = ncol(x) 之间。

LINPACK

合乎逻辑的。失效并出现错误。

细节

奇异值分解在许多统计技术中起着重要作用。 svdLa.svd提供了两个接口,其返回值有所不同。

对于大型矩阵来说,计算奇异向量是最慢的部分。如果 nu <= min(n, p)nv <= min(n, p) 的计算效率会更高,如果两者都为零,计算效率会更高。

底层 LAPACK 代码的不成功结果将导致错误,给出正错误代码(最常见的是 1 ):这些只能通过详细研究 FORTRAN 代码来解释,但这意味着算法无法收敛。

x 中缺少 NaN 或无限值将给出错误。

由 LAPACK 计算的矩阵的 SVD 分解,

其中 是正交的, 表示 V 转置(对于复数输入共轭), 是对角矩阵,其中(非负)奇异值 按降序排列。等效地, ,这在示例中得到了验证。

返回值是一个包含组件的列表

d

包含 x 的奇异值的向量,长度为 min(n, p) ,按降序排序。

u

一个矩阵,其列包含 x 的左奇异向量,如果 nu > 0 则存在。尺寸c(n, nu)

v

一个矩阵,其列包含 x 的右奇异向量,如果 nv > 0 则存在。尺寸c(p, nv)

回想一下,奇异向量仅定义为符号(复数情况下模数为 1 的常数)。如果左奇异向量的符号发生变化,则改变相应右向量的符号会产生等效的分解。

对于 La.svd,返回值用 vt 替换 vvtv 的转置(如果复数则为共轭)。

例子

hilbert <- function(n) { i <- 1:n; 1 / outer(i - 1, i, `+`) }
X <- hilbert(9)[, 1:6]
(s <- svd(X))
D <- diag(s$d)
s$u %*% D %*% t(s$v) #  X = U D V'
t(s$u) %*% X %*% s$v #  D = U' X V

来源

使用的主要函数是 LAPACK 例程 DGESDDZGESDD

LAPACK 来自https://netlib.org/lapack/,其指南在参考文献中列出。

参考

Anderson. E. and ten others (1999) LAPACK Users' Guide. Third Edition. SIAM.
Available on-line at https://netlib.org/lapack/lug/lapack_lug.html.

The ‘Singular-value decomposition’ Wikipedia article.

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

也可以看看

eigenqr

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Singular Value Decomposition of a Matrix。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。