當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。