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

标签 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;

最佳答案

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

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

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

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

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

关于matlab - Exp 的自定义算法。 Matlab 中的最大化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15277388/

相关文章:

apache-spark - 如何更新 ALS 的 Spark MatrixFactorizationModel

math - Gnuplot 中的高斯峰值不重叠

python - 为什么相同数据的 scipy.stats.gaussian_kde() 比 seaborn.kde_plot() 慢?

machine-learning - 如何针对噪声(分散)数据选择回归算法?

Python-文本挖掘-TypeError : __hash__ method should return an integer

matlab - 非对称高斯滤波器 - 水平和垂直滤波器的不同尺寸和 STD

arrays - 在 MATLAB 中查找向量中重复次数最多的 10 个元素

matlab - 如何获取二值图像轮廓的坐标?

matlab - 矩阵的第一个非单维究竟是什么?

matlab - 使用键盘输入切换值以绘制