代码之家  ›  专栏  ›  技术社区  ›  flatronka

Matlab中用于表达式最大化的自定义算法

  •  2
  • flatronka  · 技术社区  · 11 年前

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

    我部分完成了该算法,当我将随机猜测值($\mu$、$\sigma$、$\pi$)设置为接近实际值时,它就起作用了。但是,当我设置的值与实际值相去甚远时,算法不会收敛。西格玛为0美元(2.30760684053766e-24 2.307606840 53766e-4)。

    我认为问题在于我的协方差计算,我不确定这是否是正确的方法。我在维基百科上找到的 enter image description here . 如果你能检查一下我的算法,我将不胜感激。尤其是协方差部分。

    祝您有个美好的一天, 谢谢

    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;
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   Andrew Mao    11 年前

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

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

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

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

    在你的情况下,你的方程式是正确的;维基百科上的协方差更新计算与上面链接的幻灯片45上的计算相同。然而,如果你在二维空间中,对于每个分量,平均值应该是长度为2的向量,协方差应该是2x2的矩阵。因此,您的代码(针对两个分量)是错误的,因为您有一个2x2矩阵来存储均值,而有一个2x2矩阵来保存协方差;它应该是一个2x2x2矩阵。