gpt4 book ai didi

python - numpy:可以反转零行列式矩阵吗?

转载 作者:行者123 更新时间:2023-11-28 16:34:15 29 4
gpt4 key购买 nike

根据定义,行列式为零的方阵不可逆。但是,出于某种原因,在生成协方差矩阵后,我成功地对其进行了逆运算,但采用协方差矩阵的行列式最终得到了 0.0 的输出。

可能会出现什么问题?我应该不相信行列式输出,还是不应该相信逆协方差矩阵?还是两者兼而有之?

我的代码片段:

cov_matrix = np.cov(data)
adjusted_cov = cov_matrix + weight*np.identity(cov_matrix.shape[0]) # add small weight to ensure cov_matrix is non-singular
inv_cov = np.linalg.inv(adjusted_cov) # runs with no error, outputs a matrix
det = np.linalg.det(adjusted_cov) # ends up being 0.0

最佳答案

numerical inversion of matrices不涉及计算行列式。 (Cramer's formula 的逆对于大型矩阵不实用。)因此,行列式计算为 0(由于 float 精度不足)这一事实并不是矩阵求逆例程的障碍。

根据 BobChao87 的评论,这里是一个简化的测试用例(Python 3.4 控制台,numpy 导入为 np)

A = 0.2*np.identity(500)
np.linalg.inv(A)

输出:一个主对角线上有5的矩阵,是A的正确逆矩阵。

np.linalg.det(A)

输出:0.0,因为行列式 (0.2^500) 太小而无法用 double 表示。

一个可能的解决方案是一种 pre-conditioning (这里,只是重新缩放):在计算行列式之前,将矩阵乘以一个因子,使其条目平均更接近 1。在我的示例中,np.linalg.det(5*A) 返回 1。

当然,这里使用因子 5 是作弊,但是 np.linalg.det(3*A) 也会返回一个非零值(大约 1.19e-111)。如果您尝试 np.linalg.det(2**k*A) 让 k 运行适度的正整数,您很可能会找到一个返回非零值的值。然后你就会知道原始矩阵的行列式大约是输出的 2**(-k*n) 倍,其中 n 是矩阵大小。

关于python - numpy:可以反转零行列式矩阵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28712734/

29 4 0
文章推荐: jquery - 删除
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com