当前位置: 首页 > 知识库问答 >
问题:

numpy:零行列式矩阵可能被反转?

严玉泽
2023-03-14

根据定义,行列式为零的方阵不应可逆。然而,出于某种原因,在生成协方差矩阵后,我成功地对其求逆,但求协方差矩阵的行列式的结果是输出为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

共有1个答案

何涵育
2023-03-14

矩阵的数值反演不涉及行列式的计算。(Cramer的逆公式不适用于大型矩阵。)因此,行列式的计算结果为0(由于浮点精度不足)这一事实并不是矩阵求逆例程的障碍。

根据BobCha87的评论,这里是一个简化的测试用例(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)太小,无法用双精度表示。

一种可能的解决方案是一种预处理(这里,只是重新缩放):在计算行列式之前,将矩阵乘以一个因子,使其条目平均更接近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是矩阵大小。

 类似资料:
  • 我想取一个nxn矩阵的逆矩阵,用于我的GraphSlam。 我遇到的问题: <代码>。inverse()特征库(3.1.2)不允许零值,返回NaN LAPACK(3.4.2)库不允许使用零行列式,但允许使用零值(使用C中使用LAPACK计算矩阵逆的示例代码) 由于某种原因,Seldon库(5.1.2)无法编译 是否有人成功实现了允许负值、零值和零行列式的n x n矩阵反演代码?有什么好的库(C)推

  • 我正在实现一个稀疏矩阵类,使用映射向量来存储数据(映射表示矩阵的一行,其中键是列的索引,值是该位置的maitrix的值)我已经编写了计算行列式的函数,但我不知道是否有一种方法可以计算这种节省的时间(因为矩阵是稀疏的,大多数值为零)在这里我的实现: 这是类接口 我计算行列式的方式是什么?假设运算符()以这种方式重载 提前感谢您的帮助

  • 问题内容: 我有以下内容: 如何在XYZ_2上执行与在XYZ_2上相同的操作?我会以某种方式首先重塑数组吗? 问题答案: 您似乎正在尝试的最后一个轴 与最后一个 。因此,您可以像这样使用- 相关帖子了解。 为了完整起见,在交换的最后两个轴后,我们当然也可以使用,例如- 这将不如一个高效。 运行时测试- 一般而言,涉及张量时,效率要高得多。由于的轴只有一个,因此我们可以通过重整,使用,获取结果并将其

  • 在使用numpy的python中,假设我有两个矩阵: 稀疏矩阵 密集的x*y矩阵 现在我想做,它将返回一个密集的矩阵。 但是,我只关心中非零的单元格,这意味着如果我这样做了,对我的应用程序不会有任何影响 <代码>S\u=S*S\u 显然,这将是对操作的浪费,因为我想把在

  • 问题内容: 我正在使用Numpy将数据存储到矩阵中。从R背景开始,有一种极其简单的方法将函数应用于矩阵的行/列或两者。 python / numpy组合是否有类似的东西?编写自己的小实现不是问题,但是在我看来,我想出的大多数版本都将比现有的实现效率低得多/占用更多内存。 我想避免从numpy矩阵复制到局部变量等,这可能吗? 我尝试实现的功能主要是简单的比较(例如,某列中有多少个元素小于数字x,或者

  • 我想用极大值生成一个包含随机项的矩阵,这样矩阵的行列式就不会为零,然后进一步在Moodle的堆栈中实现这一点。我对Maxima(或任何与此相关的CA)的工作都是全新的,因此我一直在浏览我在网上找到的各种示例,到目前为止,我成功地做到了这一点: 生成具有0或1的2x2随机矩阵(出于简单性原因)并计算其行列式: 对于下一步,我想定义一个矩阵M2,如下所示: 如果矩阵M1的行列式已经不是零,好吧,我会同