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


R kappa 計算或估計矩陣的條件數


R語言 kappa 位於 base 包(package)。

說明

正則(方)矩陣的條件數是矩陣範數與其逆矩陣範數(或pseudo-inverse)的乘積,因此取決於matrix-norm的類型。

kappa() 默認計算(估計)矩陣或 分解的 矩陣的 2 範數條件數(可能是線性擬合)。 2-範數條件數可以表示為矩陣的最大非零奇異值與最小非零奇異值之比。

rcond() 計算條件數倒數的近似值,請參閱詳細信息。

用法

kappa(z, ...)
## Default S3 method:
kappa(z, exact = FALSE,
      norm = NULL, method = c("qr", "direct"),
      inv_z = solve(z),
      triangular = FALSE, uplo = "U", ...)

## S3 method for class 'lm'
kappa(z, ...)
## S3 method for class 'qr'
kappa(z, ...)

.kappa_tri(z, exact = FALSE, LINPACK = TRUE, norm = NULL, uplo = "U", ...)

rcond(x, norm = c("O","I","1"), triangular = FALSE, uplo = "U", ...)

參數

z , x

數字或複數矩陣或 qr 的結果或來自從 "lm" 繼承的類的擬合。

exact

合乎邏輯的。結果應該是精確的(不超過小舍入誤差)而不是快速的(但相當不準確)?

norm

字符串,指定要計算條件數的矩陣範數,請參閱函數 norm() 。對於 kappa() ,默認值為 "2" ,對於 rcond() ,默認值為 "O" ,對於 .kappa_tri() ,默認值取決於 exact :如果為真,則默認值為 "2" ,否則"O" ,表示一範數或一範數。對於 exact=FALSE ,當前唯一可能的值是無窮範數的 "I" 。對於 exact=TRUE ,範數可以是 "2" ,或 norm(., type = *) 中任何可能的 type 值。

method

部分匹配的字符串,指定要使用的方法; "qr" 主要是向後兼容的默認值。

inv_z

對於 exact=TRUE, norm != "2" ,(近似值)solve(z) ;可以是矩陣 z 的偽逆矩陣或快速近似逆矩陣。默認情況下,當 exact 為 true 時,solve(z) 是條件計算中最昂貴的部分。

triangular

合乎邏輯的。如果為 true,則使用的矩陣隻是 z (或 x )的上三角部分或下三角部分,具體取決於

uplo

字符串,"U""L" 。僅在 triangular = TRUE 時使用,指示是否使用矩陣的上三角部分或下三角部分。

LINPACK

合乎邏輯的。如果為 true 並且 z 不複雜,則調用 LINPACK 例程 dtrco();否則相關的 LAPACK 例程是。

...

傳入或傳出其他方法的進一步參數;對於 kappa.*() ,特別是當 norm 不是 "2" 時的 LINPACK

細節

對於 kappa() ,如果 exact = FALSE (默認),則通過 qr(x) 分解 的三角矩陣 的 1-範數的廉價近似來估計條件數。然而,精確的 2-範數計算(通過 svd )也可能足夠快。

請注意,近似 1- 和 Inf-norm 條件數通過method = "direct"計算速度要快得多,並且rcond()計算這些r互惠的條件數,也適用於複雜矩陣,使用標準 LAPACK 例程。目前,還kappa*()函數計算這些近似值exact為 false,即默認情況下。

kapparcond 是部分相同函數的不同接口。

.kappa_tri是一個內部函數,由kappa.qrkappa.default;tri是為了Angular 及其方法僅考慮矩陣的上三角部分或下三角部分,具體取決於uplo = "U"或者"L",其中"U"之前是內部硬連線的R4.4.0。

底層 LAPACK 代碼的不成功結果將導致錯誤,並給出正錯誤代碼:這些隻能通過詳細研究 FORTRAN 代碼來解釋。

條件編號 或近似值 exact = FALSE

例子

kappa(x1 <- cbind(1, 1:10)) # 15.71
kappa(x1, exact = TRUE)     # 13.68
kappa(x2 <- cbind(x1, 2:11)) # high! [x2 is singular!]

hilbert <- function(n) { i <- 1:n; 1 / outer(i - 1, i, `+`) }
sv9 <- svd(h9 <- hilbert(9))$ d
kappa(h9)  # pretty high; by default {exact=FALSE, method="qr"} :
kappa(h9) == kappa(qr.R(qr(h9)), norm = "1")
all.equal(kappa(h9, exact = TRUE), # its definition:
          max(sv9) / min(sv9),
          tolerance = 1e-12) ## the same (typically down to 2.22e-16)
kappa(h9, exact = TRUE) / kappa(h9)  # 0.677 (i.e., rel.error = 32%)

## Exact kappa for rectangular matrix
## panmagic.6npm1(7) :
pm7 <- rbind(c( 1, 13, 18, 23, 35, 40, 45),
             c(37, 49,  5, 10, 15, 27, 32),
             c(24, 29, 41, 46,  2, 14, 19),
             c(11, 16, 28, 33, 38, 43,  6),
             c(47,  3,  8, 20, 25, 30, 42),
             c(34, 39, 44,  7, 12, 17, 22),
             c(21, 26, 31, 36, 48,  4,  9))

kappa(pm7, exact=TRUE, norm="1") # no problem for square matrix

m76 <- pm7[,1:6]
(m79 <- cbind(pm7, 50:56, 63:57))

## Moore-Penrose inverse { ~= MASS::ginv(); differing tol (value & meaning)}:
## pinv := p(seudo) inv(erse)
pinv <- function(X, s = svd(X), tol = 64*.Machine$double.eps) {
    if (is.complex(X))
        s$u <- Conj(s$u)
    dx <- dim(X)
    ## X = U D V' ==> Result =  V {1/D} U'
    pI <- function(u,d,v) tcrossprod(v, u / rep(d, each = dx[1L]))
    pos <- (d <- s$d) > max(tol * max(dx) * d[1L], 0)
    if (all(pos))
        pI(s$u, d, s$v)
    else if (!any(pos))
        array(0, dX[2L:1L])
    else { # some pos, some not:
        i <- which(pos)
        pI(s$u[, i, drop = FALSE], d[i],
           s$v[, i, drop = FALSE])
    }
}

## rectangular
kappa(m76, norm="1")
try( kappa(m76, exact=TRUE, norm="1") )# error in  solve().. must be square

## ==> use pseudo-inverse instead of solve() for rectangular {and norm != "2"}:
iZ <- pinv(m76)
kappa(m76, exact=TRUE, norm="1", inv_z = iZ)
kappa(m76, exact=TRUE, norm="M", inv_z = iZ)
kappa(m76, exact=TRUE, norm="I", inv_z = iZ)

iX <- pinv(m79)
kappa(m79, exact=TRUE, norm="1", inv_z = iX)
kappa(m79, exact=TRUE, norm="M", inv_z = iX)
kappa(m79, exact=TRUE, norm="I", inv_z = iX)

作者

The design was inspired by (but differs considerably from) the S function of the same name described in Chambers (1992).

來源

LAPACK 例程DTRCONZTRCON 以及LINPACK 例程DTRCO

LAPACK 和 LINPACK 來自https://netlib.org/lapack/https://netlib.org/linpack/,它們的指南在參考文獻中列出。

參考

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

Chambers, J. M. (1992) Linear models. Chapter 4 of Statistical Models in S eds J. M. Chambers and T. J. Hastie, Wadsworth & Brooks/Cole.

Dongarra, J. J., Bunch, J. R., Moler, C. B. and Stewart, G. W. (1978) LINPACK Users Guide. Philadelphia: SIAM Publications.

也可以看看

norm; svd 用於奇異值分解,qr 用於 分解。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Compute or Estimate the Condition Number of a Matrix。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。