gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:44:32 25 4
gpt4 key购买 nike

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

25 4 0