MATLAB:协方差矩阵的行列式是0或inf

时间:2016-04-28 16:49:31

标签: matlab matrix machine-learning statistics linear-algebra

我有一个1500x1500的协方差矩阵,我试图计算EM-ML方法的决定因素。协方差矩阵是通过找到SIGMA矩阵然后将其传递到nearestSPD库(Link) 以使矩阵为正定而获得的。在这种情况下,矩阵总是单数的。我尝试的另一种方法是使用A' * A技术手动生成正定矩阵。 (A被视为1600x1500矩阵)。这总是让我的决定因素是无限的。关于如何用有限行列式得到正定矩阵的任何想法?

1 个答案:

答案 0 :(得分:0)

您是否确实需要决定因素或行列式的日志? 例如,如果您正在计算高斯的对数似然,则输入对数似然的是行列式的对数。在高维度中,决定因素不适合双重,但其日志最有可能。

如果你执行协方差C的胆怯分解,用(下三角)因子L说明

for r in range(how_many):
    for c in range (how_many):
        print list [r][c]           

然后

C = L*L'

但是下三角矩阵的行列式是其对角元素的乘积,因此,我们得到上面的日志:

det C = det(L) * det( L') = det(L) * det(L)

(回应评论) 即使您需要计算高斯pdf,最好只计算需要时计算的日志和指数。例如,具有协方差C(具有胆甾烷因子L)和平均值0(纯粹为了节省打字)的d维角高斯是:

log det C = 2*Sum{ i | log( L[i,i])}

所以

p(x) = exp( -0.5*x'*inv(C)*x) /( sqrt( pow(2pi,d) * det(C)) 

也可以写

log p(x) = -0.5*x'*inv(C)*x - 0.5*d*log(2pi) - 0.5*log(det(C))

,其中

log p(x) = -0.5*y'*y - 0.5*d*log(2pi) - log(det(L))