首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇异矩阵与非矩阵:行列式与秩的冲突

奇异矩阵与非矩阵:行列式与秩的冲突
EN

Stack Overflow用户
提问于 2022-06-28 19:59:57
回答 1查看 43关注 0票数 2

我使用https://openresearch-repository.anu.edu.au/bitstream/1885/65527/2/01_Pozzi_Exponential_smoothing_weighted_2012.pdf中的附录C作为指南,从指数平滑的回报中建立了一个相关矩阵。

它是101×101矩阵,但由于以下相互矛盾的结果,我不知道它是否是奇异的:

  • pracma::Rank说它的排名是101;

  • matrixcalc::is.singular.matrix返回TRUE;

  • base::determinant.matrix给出了一个非常接近于零的值.

代码语言:javascript
复制
pracma::Rank(try.wgtd.cor)
#[1] 101
matrixcalc::is.singular.matrix(try.wgtd.cor)
#[1] TRUE
base::determinant.matrix(try.wgtd.cor, logarithm = FALSE)
#$modulus
#[1] 2.368591e-55
#attr(,"logarithm")
#[1] FALSE
#
#$sign
#[1] 1
#
#attr(,"class")
#[1] "det"

有人知道为什么/怎么会这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-28 20:26:44

不不要依赖行列式。一个小行列式不一定意味着奇点。例如,下面的对角线矩阵一点也不奇异,但行列式很小。

代码语言:javascript
复制
## all diagonal elements are 0.1; dimension 101 x 101
D <- diag(0.1, nrow = 101, ncol = 101)

## the obvious way to compute det(D)
prod(diag(D))
#[1] 1e-101

## use base::determinant.matrix
determinant.matrix(D, logarithm = FALSE)$modulus
#[1] 1e-101

行列式等于特征值的乘积。所以一般来说,如果一个矩阵的所有特征值都小于1,那么行列式一定会很小!

matrixcalc::is.singular.matrix是基于行列式的,所以不要相信它。此外,它的结果过于主观,因为您可以调整tol

相反,pracma::Rank使用QR和SVD分解来确定秩。结果非常可靠。下面是Rank的源代码(带我的注释):

代码语言:javascript
复制
function (M) 
{
    if (length(M) == 0) 
        return(0)
    if (!is.numeric(M)) 
        stop("Argument 'M' must be a numeric matrix.")
    if (is.vector(M)) 
        M <- matrix(c(M), nrow = length(M), ncol = 1)
    ## detect rank by QR factorization
    r1 <- qr(M)$rank
    ## detect rank by SVD factorization
    sigma <- svd(M)$d
    tol <- max(dim(M)) * max(sigma) * .Machine$double.eps
    r2 <- sum(sigma > tol)
    ## check consistency
    if (r1 != r2) 
        warning("Rank calculation may be problematic.")
    return(r2)
}

总之,你的101x101矩阵try.wgtd.cor实际上有满的排名!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72792491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档