如何在 R 中生成一个向量 x,使其外积为正定?

How to generate a vector x in R such that its outer product is positive definite?

提问人:Adrian 提问时间:9/17/2023 最后编辑:ThomasIsCodingAdrian 更新时间:9/27/2023 访问量:141

问:

set.seed(3)
n <- 5  
x <- rnorm(n)

# Compute x x^T
xxT <- outer(x, x)

library(matrixcalc)
> is.positive.definite(xxT)
[1] FALSE

上述方法并不能保证 xx^T 是正定的。解决方法是什么?

R 数学 矩阵

评论

0赞 Liang Zhang 9/17/2023
以这种方式创建的 AFAIK 不会是正定的,因为它的秩将始终为 1,这意味着不是完整的秩矩阵。请参见 math.stackexchange.com/q/3164224/328688。 将是正的半定的,但当不是满排名时,它不会是正定的。xxTxxT
0赞 IRTFM 9/17/2023
stackoverflow.com/questions/22463835/....而且,stackoverflow.com/questions/16859899/......

答:

3赞 ThomasIsCoding 9/26/2023 #1

长话短说:你没有办法确定肯定。xxT


在数学上,如果长度大于 ,则为正半定而不是正定,因为您总能找到任何给定向量的零空间。这意味着,你总能找到一个非零矩阵,其空空间包含 ,使得 -> -> -> ,其中 是一个全零向量。x1xxTxAxt(v) %*% xxT %*% v(t(v)%*%x) %*% t(t(v) %*% x)0 %*% t(0)00

在您的示例中,您可以看到 null 可以通过xx

> (nulls <- MASS::Null(x))
            [,1]        [,2]        [,3]        [,4]
[1,] -0.18713251  0.16555019 -0.73703375  0.12524482
[2,]  0.97832152  0.01917826 -0.08538212  0.01450906
[3,]  0.01917826  0.98303360  0.07553485 -0.01283571
[4,] -0.08538212  0.07553485  0.66371688  0.05714490
[5,]  0.01450906 -0.01283571  0.05714490  0.99028931

并通过以下方式进行验证nulls

> crossprod(nulls, x)
              [,1]
[1,] -4.640385e-17
[2,] -3.729655e-17
[3,]  9.887924e-17
[4,]  5.551115e-17

从这个意义上说,来自所跨越空间的任何向量都将导致 ,因此不是正定的,而是正的半定的。vnullst(v) %*% xxT %*% v == 0

评论

1赞 Mikael Jagan 9/26/2023
几个吹毛求疵:(1) 是(微不足道的)正定的,当是 1 并且不为零时。(2)你说,“你总能在零空间找到一个非零向量”,但我认为你的意思是,“你总能找到一个非零矩阵,它的零空间包含......?然后,该矩阵的任何非零行都将用作您的...tcrossprod(x)length(x)xvxAxv
0赞 ThomasIsCoding 9/26/2023
@MikaelJagan 感谢您的严谨描述。在答案中更新。