gpt4 book ai didi

python - Numpy Cholesky 分解 LinAlgError

转载 作者:太空狗 更新时间:2023-10-29 21:29:10 27 4
gpt4 key购买 nike

在我尝试对周期性边界条件二维数组的方差-协方差矩阵执行 cholesky 分解时,在某些参数组合下,我总是得到 LinAlgError: Matrix is not positive definite - Cholesky decomposition cannot be computed。不确定是 numpy.linalg 还是实现问题,因为脚本很简单:

sigma = 3.
U = 4

def FromListToGrid(l_):
i = np.floor(l_/U)
j = l_ - i*U
return np.array((i,j))

Ulist = range(U**2)

Cov = []
for l in Ulist:
di = np.array([np.abs(FromListToGrid(l)[0]-FromListToGrid(i)[0]) for i, x in enumerate(Ulist)])
di = np.minimum(di, U-di)

dj = np.array([np.abs(FromListToGrid(l)[1]-FromListToGrid(i)[1]) for i, x in enumerate(Ulist)])
dj = np.minimum(dj, U-dj)

d = np.sqrt(di**2+dj**2)
Cov.append(np.exp(-d/sigma))
Cov = np.vstack(Cov)

W = np.linalg.cholesky(Cov)

移除潜在奇点的尝试也未能解决问题。非常感谢任何帮助。

最佳答案

深入挖掘问题,我尝试打印 Cov 矩阵的特征值。

print np.linalg.eigvalsh(Cov)

答案是这样的

[-0.0801339  -0.0801339   0.12653595  0.12653595  0.12653595  0.12653595 0.14847999  0.36269785  0.36269785  0.36269785  0.36269785  1.09439988 1.09439988  1.09439988  1.09439988  9.6772531 ]

啊哈!注意到前两个负特征值了吗?现在,一个矩阵是正定的当且仅当它的所有特征值都是正的。所以,矩阵的问题不是它接近“零”,而是它是“负”。扩展 @duffymo 的类比,这是线性代数,相当于尝试对负数求平方根。

现在,让我们尝试执行相同的操作,但这次使用 scipy。

scipy.linalg.cholesky(Cov, lower=True)

这并没有说明更多

numpy.linalg.linalg.LinAlgError: 12-th leading minor not positive definite

这说明了更多信息,(虽然我真的不明白为什么它会提示第 12 次未成年人)。

最重要的是,矩阵不是很接近“零”,而是更像是“负”

关于python - Numpy Cholesky 分解 LinAlgError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21604498/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com