【问题标题】:Is there a way to generate a matrix in R with at least some negative eigenvalues?有没有办法在 R 中生成一个至少有一些负特征值的矩阵?
【发布时间】:2020-07-29 19:53:33
【问题描述】:

我想生成一个至少有一些负特征值的矩阵?我正在尝试使用矩阵的谱分解来做到这一点,但它不能保证至少有一个负特征值

【问题讨论】:

  • 除具有至少一个负特征值的矩阵外,没有其他约束?
  • 我忘了说矩阵必须是正方形的,即nxn
  • 这是一个奇怪的要求,只是生成随机矩阵并测试它们?
  • 是的哈哈,我希望在负半定方阵上测试一种算法,将其变为半正定矩阵,但如果可能的话,我需要一种有效的方法来生成随机负半定矩阵。甚至是一种从特征值中得出一个负半定的方法。
  • 您继续在 cmets 中添加约束。为什么不在问题本身中明确说明它们?无论如何,这似乎更像是一个数学问题而不是编程问题。也许Mathematics 会是一个更好的提问地点。

标签: r correlation eigenvalue


【解决方案1】:

这是一个简单的例子,可以帮助你构建这种矩阵

library(pracma)

N <- 3
U <- randortho(N, type = "orthonormal")
A <- diag(sample(c(-runif(1),rnorm(N-1)))) # ensure at least one negative eigenvalue 
M <- U %*% A %*% t(U)

然后

> M
            [,1]        [,2]       [,3]
[1,] -0.36818879  0.02406988  0.1634275
[2,]  0.02406988 -0.72613068 -0.1872272
[3,]  0.16342748 -0.18722722 -0.3116400

仔细检查特征值

> eig(M)
[1] -0.1432527 -0.4484647 -0.8142421

> A
           [,1]       [,2]       [,3]
[1,] -0.1432527  0.0000000  0.0000000
[2,]  0.0000000 -0.4484647  0.0000000
[3,]  0.0000000  0.0000000 -0.8142421

【讨论】:

    【解决方案2】:

    如果你生成一个随机正定矩阵并将其乘以 -1 ... 会怎样?

    在这个例子中,我将创建一个正对角线的下三角矩阵,并将其乘以它的转置(还有很多其他方法):

    set.seed(101)
    m <- matrix(0,5,5)
    m[lower.tri(m,diag=TRUE)] <- rnorm(15)
    diag(m) <- abs(diag(m))
    m2 <- m %*% t(m)
    

    (如果你只希望它是半定的,你只需要确保对角线是非负的......)

    是 pos def 吗?

    v1 <- eigen(m2)$values
    ## [1] 5.976142640 1.908831945 0.904991040 0.037025982 0.002181558
    all(v1>0) ## TRUE
    

    检查 evals(-m2) == -evals(m2) ...

    v2 <- eigen(-m2)$values
    all(v2<0)  ## TRUE
    all.equal(sort(v1),-v2)  ## TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-02
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2023-04-06
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多