当在一次或迭代地运行所有迭代时,fitgmdist在MATLAB中的GMM给出不同的结果

时间:2016-05-21 00:42:48

标签: matlab gaussian mixture-model

我正在设计一种需要部分运行EM算法的新算法。我正在使用MATLAB(R2015b)fitgmdist。

我观察到通过以下方法获得的解决方案之间的差异:(1)一次运行大量迭代,以及(2)逐个运行相同数量的迭代。请注意,两个版本使用相同的起始点,重复次数保留为1(默认值),RegularizationValue保留为默认值(0)。

那么差异来自哪里?

以下是演示此问题的代码:

mu1 = [1 1];
Sigma1 = [2 0; 0 0.5];
mu2 = [1 -1];
Sigma2 = [1 0;0 1];
rng(20); % For reproducibility
X = [mvnrnd(mu1,Sigma1,1000);mvnrnd(mu2,Sigma2,1000)];

start = [];
start.mu = [X(randi(size(X,1)),:); X(randi(size(X,1)),:)];
start.Sigma = [];
start.Sigma = cat(3, start.Sigma, Sigma1+rand(1));
start.Sigma = cat(3, start.Sigma, Sigma2+rand(1));

% run 100 iterations
GMModel = fitgmdist(X,2,'Options',statset('MaxIter',100),'Start',start);

% now run 100 iterations one by one
for i=1:100
    GMModel2 = fitgmdist(X,2,'Options',statset('MaxIter',1),'Start',start);
    % set the start to result after 1 iteration
    start.mu = GMModel2.mu;
    start.Sigma = GMModel2.Sigma;
    start.ComponentProportion = GMModel2.ComponentProportion;
end


GMModel

% GMModel = 
% 
% Gaussian mixture distribution with 2 components in 2 dimensions
% Component 1:
% Mixing proportion: 0.470964
% Mean:       0.9345       0.9932
% 
% Component 2:
% Mixing proportion: 0.529036
% Mean:       1.0809      -0.8807



GMModel2

% GMModel2 = 
% 
% Gaussian mixture distribution with 2 components in 2 dimensions
% Component 1:
% Mixing proportion: 0.481425
% Mean:      0.93994      0.98135
% 
% Component 2:
% Mixing proportion: 0.518575
% Mean:       1.0788     -0.90749

编辑: 我之前没有检查的一件事是GMModel使用的迭代次数(当MaxIter设置为100时)。它在74次迭代后停止了。

GMModel.NumIterations
%ans =
%    74

一次迭代一次迭代74的负对数似然与100 MaxIter的负对数似然相同。在迭代75,它下降了~0.006。所以出现了另一个问题,为什么MaxIter 100版本在迭代74时停止,当对数似然下降超过1e-6的容差时?

1 个答案:

答案 0 :(得分:1)

停止可能与MATLAB/R201Xy/toolbox/stats/stats/@gmdistribution/private/gmcluster.m中的收敛性检查有关,大概是gmcluster_learn的一半:

%check if it converges
llDiff = ll-ll_old;
if llDiff >= 0 && llDiff < options.TolFun *abs(ll)                                                                                                                    
    optimInfo.Converged=true;
    break;
end
ll_old = ll; 

其中ll是通过[ll,post] = estep(log_lh);设置的,但是在它设置的函数顶部附近

ll_old = -inf;

因此,当您同时运行所有内容时,llDiff会在迭代中缩小,但是当您逐个运行时,它仍会很大并且收敛检查始终会失败。