简化EM的公式

时间:2015-01-24 12:23:55

标签: matlab math mixture-model

我想在Matlab中计算以下公式(多项式混合模型的EM的E步骤),
enter image description here

g和θ是矩阵,θ和λ具有以下约束:
enter image description here
enter image description here
但是m的计数大于1593,当计算θ的乘积时,数字变得非常小,Matlab将其保存为零。 任何人都可以简化g公式或使用其他技巧来解决这个问题?

更新

数据: data.txt (下载后,将文件扩展名更改为“mat”)

代码:

function EM(data)
%% initialize
K=2;
[N M]=size(data);
g=zeros(N,K);
landa=ones(K,1) .* 0.5;
theta = rand(M, K);
theta = bsxfun(@rdivide, theta, sum(theta,1))';
%% EM
for i=1:10
%% E Step
    for n=1:N
        normalize=0;
        for k=1:K
            g(n,k)=landa(k) * prod(theta(k,:) .^ data(n,:));
            normalize=normalize + landa(k) * prod(theta(k,:) .^ data(n,:));
        end
        g(n,:)=g(n,:) ./ normalize;
    end
%% M Step 
    for k=1:K
        landa(k)=sum(g(:,k)) / N ;
        for m=1:M
            theta(k,m)=(sum(g(:,k) .* data(:,m)) + 1) / (sum(g(:,k) .* sum(data,2)) + M);
        end
    end
end

1 个答案:

答案 0 :(得分:5)

您可以使用对数的计算而不是实际值来避免下溢问题。

首先,我们稍微重新格式化E步骤代码:

for n = 1 : N
    for k = 1 : K
        g(n, k) = lambda(k) * prod(theta(k, :) .^ data(n, :));
    end
end
g = bsxfun(@rdivide, g, sum(g, 2));

因此,我们不是在一个额外的变量normalize中累积分母,而是在两个循环之后的一步中进行归一化。

现在我们引入一个变量lg,其中包含g的对数:

for n = 1 : N
    for k = 1 : K
        lg(n, k) = log(lambda(k)) + sum(log(theta(k, :)) .* data(n, :));
    end
end
g = exp(lg);
g = bsxfun(@rdivide, g, sum(g, 2));

到目前为止,一切都没有实现。只需将下溢从循环中移动到从lgg的转换,然后再通过指数进行转换。

但是,在下一行中有标准化步骤,这意味着g的正确值并非真正必要:所有重要的是不同的值具有正确的比率他们之间。这意味着我们可以将所有共同进入归一化的值除以任意常数,而不改变最终结果。在对数标度上,这意味着减去某些东西,我们选择这个是lg的算术平均值(对应于g的调和平均值):

lg = bsxfun(@minus, lg, mean(lg, 2));
g = exp(lg);
g = bsxfun(@rdivide, g, sum(g, 2));

通过减法,对数值从-2000这样的数字移动到类似+50或-30之类的东西,这些数字不会在指数中存活。 g的值现在是合理的,可以很容易地归一化以达到正确的最终结果。