3

我不确定这是否是编程或统计问题,但我 %99 确定应该存在数字问题。所以也许可以提出一个程序化的解决方案。

我正在使用 MATLAB 的 mvnpdf 函数来计算一些观测值的多元高斯 PDF。我经常收到“SIGMA 必须是对称且正定的”错误。

但是,我从数据中获取协方差矩阵,所以数据应该是合法的。重新生成问题的代码是:

err_cnt = 0;
for i = 1:1000
    try 
        a = rand(3); 
        c = cov(a); 
        m = mean(a); 
        mvnpdf(a, m, c);
    catch me
        err_cnt = err_cnt + 1;
    end
end

每次运行时,我都会收到约 500-600 个错误。

PS我的情况下不生成随机数据,只是在这里生成演示一下。

4

3 回答 3

12

这是一个线性代数问题,而不是一个编程问题。回忆一下 k 维多元正态分布的 PDF 公式:

在此处输入图像描述

当您的矩阵不是严格正定的(即,它是奇异的)时,分母中的行列式为零并且指数中的倒数未定义,这就是您得到错误的原因。

然而,一个常见的误解是协方差矩阵必须是正定的。这不是真的——协方差矩阵只需要是半正定的。您的数据完全有可能具有奇异的协方差矩阵。此外,由于您正在形成的是观察数据的样本协方差矩阵,因此您可能会因没有足够的观察结果而产生奇点。

于 2012-06-30T03:29:18.140 回答
2

如果协方差矩阵的对角线值(非常接近)零,就会发生这种情况。一个简单的解决方法是将一个非常小的常数添加到c.

err_cnt = 0;
for i = 1:1000
    try 
        a = rand(3); 
        c = cov(a) + .0001 * eye(3); 
        m = mean(a); 
        mvnpdf(a, m, c);
    catch me
        err_cnt = err_cnt + 1;
    end
end

结果为 0 个错误。

于 2012-06-30T02:06:59.787 回答
0

当您的数据位于子空间(奇异协方差矩阵)中时,概率密度在整个空间中是奇异的。粗略地说,这意味着你的密度在每个点上都是无限的,这不是很有用。因此,如果是这种情况,并且它不是数字,那么您可能需要考虑数据跨越的子空间中的概率密度。这里的密度是很好定义的。在这种情况下,将对角线值添加为 @Junuxx 会产生非常不同的值。

于 2012-07-01T17:06:14.780 回答