【问题标题】:R chol and positive semi-definite matrixR chol 和半正定矩阵
【发布时间】:2016-01-27 00:18:43
【问题描述】:

我有以下矩阵:

j <- matrix(c(1,1,.5,1,1,.5,.5,.5,1), nrow=3, ncol=3)

这是半正定的,因为所有的特征值都 >= 0。

来源:https://math.stackexchange.com/questions/40849/how-to-check-if-a-symmetric-4-times4-matrix-is-positive-semi-definite

> eigen(j, symmetric = TRUE)
$values
[1] 2.3660254 0.6339746 0.0000000

$vectors
           [,1]       [,2]          [,3]
[1,] -0.6279630 -0.3250576  7.071068e-01
[2,] -0.6279630 -0.3250576 -7.071068e-01
[3,] -0.4597008  0.8880738 -1.942890e-15

但是,cholesky 分解失败了……

> chol(j)
Error in chol.default(j) : 
  the leading minor of order 2 is not positive definite

我还从网上改编了一些代码...

cholesky_matrix <- function(A){
    # http://rosettacode.org/wiki/Cholesky_decomposition#C

    L <- matrix(0,nrow=nrow(A),ncol=ncol(A))
    colnames(L) <- colnames(A)
    rownames(L) <- rownames(A)

    m <- ncol(L)


    for(i in 1:m){
        for(j in 1:i){
            s <- 0
            if(j > 1){
                for(k in 1:(j-1)){
                    s <- s + L[i,k]*L[j,k]
                }
            }
            if(i == j){
                L[i,j] <- sqrt(A[i,i] - s)
            } else {
                L[i,j] <- (1 / L[j,j])*(A[i,j] - s)
            }
        }
    }
    return(L)    
}

NaN 也会“失败”。

> cholesky_matrix(j)
     [,1] [,2] [,3]
[1,]  1.0    0    0
[2,]  1.0    0    0
[3,]  0.5  NaN  NaN

有人知道发生了什么吗?为什么我的分解失败了?

【问题讨论】:

    标签: r statistics linear-algebra


    【解决方案1】:

    你的矩阵的特征值是

    > eigen(j)
    $values
    [1] 2.366025e+00 6.339746e-01 4.440892e-16
    

    在数值精度的范围内,最后一个实际上为零。每?chol:

    计算实对称正定方阵的 Choleski 分解。

    (强调我的)

    也就是说,你仍然可以通过设置pivot=TRUE来得到分解,它可以处理半定性:

    > chol(j, pivot=TRUE)
         [,1]      [,2] [,3]
    [1,]    1 0.5000000    1
    [2,]    0 0.8660254    0
    [3,]    0 0.0000000    0
    attr(,"pivot")
    [1] 1 3 2
    attr(,"rank")
    [1] 2
    Warning message:
    In chol.default(j, pivot = TRUE) :
      the matrix is either rank-deficient or indefinite
    

    【讨论】:

    • Cholesky 仍然适用于正半定对吗? R 对警告信息如此具体有什么原因吗?
    • 我不知道,但它是一个巨大的拖累
    • 请注意,在这种情况下,等式 t(C)%*%C=M 不成立。见?chol
    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2013-03-08
    • 2021-01-03
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多