- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据定义,行列式为零的方阵不可逆。但是,出于某种原因,在生成协方差矩阵后,我成功地对其进行了逆运算,但采用协方差矩阵的行列式最终得到了 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/
我试图找到这 3 个函数的 Wronskian 行列式,但代码有“TypeError: No loop matching the specified signature and casting was
我需要编写一个在编译时计算行列式的 constexpr 函数。最明显的解决方案是使用拉普拉斯展开。支持 C++14。 #include #include constexpr int get_cof
是否有任何类似 A * A-1 = I 的数学性质可用于测试类似格式的单元测试中行列式的计算? 最佳答案 手动计算一个(或多个)已知数组的行列式,并将您的结果与该数字进行比较。 尝试不同大小、排列方式
我有一个大的 numpy 数组 arr,形状为 (N, D, M, D) 其中 D 是两个或三。该数组可以被认为是 (D,D) 矩阵 block ,这些矩阵在 N 和 M 维度中被阻塞在一起。我想取这
我是一名优秀的程序员,十分优秀!