2

我尝试编写一个算法,从混合多元正态分布中确定每个类的 $\mu$, $\sigma$,$\pi$。

我部分完成了算法,当我将随机猜测值($\mu$,$\sigma$,$\pi$)设置为接近真实值时,它会起作用。但是当我将值设置为远离真实值时,算法不会收敛。sigma 为 0 $(2.30760684053766e-24 2.30760684053766e-24)$。

我认为问题在于我的协方差计算,我不确定这是正确的方法。我在维基百科上找到了这个在此处输入图像描述。如果您能检查我的算法,我将不胜感激。尤其是协方差部分。

祝你有美好的一天,谢谢,

2 mixture gauss
size x  = [400, 2] (400 point 2 dimension gauss)
mu = 2 , 2 (1 row = first gauss mu, 2 row = second gauss mu)

    for i = 1 : k
        gaussEvaluation(i,:) = pInit(i) * mvnpdf(x,muInit(i,:), sigmaInit(i, :) * eye(d));
        gaussEvaluationSum = sum(gaussEvaluation(i, :));

        %mu calculation
        for j = 1 : d
            mu(i, j) = sum(gaussEvaluation(i, :) * x(:, j)) / gaussEvaluationSum;
        end
       %sigma calculation methode 1
       %for j = 1 : n 
        %    v = (x(j, :) - muNew(i, :));
        %    sigmaNew(i) = sigmaNew(i) + gaussEvaluation(i,j) * (v * v');
        %end
        %sigmaNew(i) = sigmaNew(i) / gaussEvaluationSum;

        %sigma calculation methode 2
        sub = bsxfun(@minus, x, mu(i,:));
        sigma(i,:) = sum(gaussEvaluation(i,:) * (sub .* sub)) / gaussEvaluationSum;

        %p calculation

        p(i) = gaussEvaluationSum / n;
4

1 回答 1

2

两点:即使您正确实现了高斯混合 EM,您也可以观察到这一点,但在您的情况下,代码似乎确实不正确。

首先,这只是拟合高斯混合时必须处理的问题。有时,混合物的一个成分可能会塌陷到一个点上,导致该成分的平均值变为该点而方差变为 0;这被称为“奇点”。因此,可能性也趋于无穷大。

查看此套牌的第 42 张幻灯片:http ://www.cs.ubbcluj.ro/~csatol/gep_tan/Bishop-CUED-2006.pdf

您正在评估的似然函数不是对数凹函数,因此 EM 算法不会收敛到具有不同初始值的相同参数。我在上面给出的链接还提供了一些解决方案来避免这种过度拟合问题,例如在您的参数上放置一个先验或正则化项。您还可以考虑使用不同的起始参数运行多次,并将方差为 0 的任何结果视为过度拟合而丢弃,或者只是减少您正在使用的组件数量。

在您的情况下,您的等式是正确的;Wikipedia 上的协方差更新计算与上述链接的幻灯片 45 上的计算相同。但是,如果您在 2d 空间中,则对于每个分量,均值应该是长度为 2 的向量,协方差应该是 2x2 矩阵。因此,您的代码(对于两个组件)是错误的,因为您有一个 2x2 矩阵来存储均值和一个 2x2 矩阵来存储协方差;它应该是一个 2x2x2 矩阵。

于 2013-03-07T17:38:28.703 回答