6

我得到了一个非常大的矩阵(我无法更改矩阵的值),我需要计算(协方差)矩阵的逆矩阵。

有时我会收到错误消息

 Matrix is close to singular or badly scaled.
     Results may be inaccurate

在这些情况下,我看到 det 的值返回 0。

在计算(协方差矩阵的)逆之前,我想检查 det 的值并执行类似这样的操作

covarianceFea=cov(fea_class);
covdet=det(covarianceFea);
if(covdet ==0)
    covdet=covdet+.00001;
    %calculate the covariance using this new det
end 

有没有办法使用新的 det,然后用它来计算协方差矩阵的逆?

4

3 回答 3

17

叹。计算行列式以确定奇点是一件荒谬的事情,完全如此。对于大型矩阵尤其如此。对不起,但确实如此。为什么?是的,有些书告诉你这样做。甚至可能是你的导师。

分析奇点是一回事。但是奇点的数值确定呢?除非您使用符号工具,否则 MATLAB 使用浮点运算。这意味着它将数字存储为浮点、双精度值。这些数字的数量级不能小于

>> realmin
ans =
  2.2251e-308

(实际上,就非规范化数字而言,MATLAB 比这要低一些,可以下降到大约 1e-323。)请注意,当我尝试存储一个小于该数字的数字时,MATLAB 认为它为零。

>> A = 1e-323
A =
  9.8813e-324

>> A = 1e-324
A =
     0

大矩阵会发生什么?例如,这个矩阵是奇异的吗:

M = eye(1000);

由于 M 是单位矩阵,因此它相当明显是非奇异的。事实上, det 确实表明它是非奇异的。

>> det(M)
ans =
     1

但是,将它乘以某个常数。这是否使它非单一?不!!!!!!!!!!!!!!!!!!!!!!!!当然不是。但是还是试试吧。

>>     det(M*0.1)
ans =
     0

唔。那很奇怪。MATLAB告诉我行列式为零。但我们知道行列式是 1e-1000。哦是的。天哪,1e-1000 比我刚刚向您展示的 MATLAB 可以存储为双精度数的最小数字要小得多。所以行列式下溢,即使它显然是非零的。矩阵是奇异的吗?当然不是。但是在这里使用 det 会失败吗?当然会,这是完全可以预料的。

相反,使用一个好的工具来确定奇点。使用 cond 或 rank 之类的工具。例如,我们可以愚弄排名吗?

>> rank(M)
ans =
        1000

>> rank(M*.1)
ans =
        1000

看到秩知道这是一个满秩矩阵,不管我们是否缩放它。cond 也是一样,计算 M 的条件数。

>> cond(M)
ans =
     1

>> cond(M*.1)
ans =
     1

欢迎来到浮点运算的世界。哦,顺便说一句,忘记 det 作为几乎任何使用浮点运算的计算的工具。这几乎总是一个糟糕的选择。

于 2011-10-09T13:33:00.763 回答
5
于 2011-10-09T14:17:23.397 回答
1

在这种情况下,计算逆不是一个好主意。如果你只需要这样做,我建议使用它来提高显示精度:

format long;

其他建议可能是尝试使用矩阵的 SVD 并在那里修改奇异值。

A = U∑V'
inv(A) = V*inv(∑)*U'

∑ 是一个对角矩阵,您将在其中看到一个接近 0 的对角线条目。如果您想要某种近似值,请尝试使用此数字。

于 2011-10-09T11:16:37.180 回答