我尝试编写一种算法,根据混合多元正态分布确定每个类的$ \ 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;

最佳答案

有两点:即使正确实现了高斯混合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的矩阵。

07-24 09:52
查看更多