Exp的自定义算法。 Matlab中的最大化

时间:2013-03-07 17:07:34

标签: matlab machine-learning gaussian normal-distribution

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

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

我认为问题是我的协变计算,我不确定这是正确的方法。我在维基百科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 个答案:

答案 0 :(得分:2)

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

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

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

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

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