1

EM アルゴリズムを部分的に実行する必要がある新しいアルゴリズムを設計しています。これには MATLAB の (R2015b) fitgmdist を使用しています。

(1) 一度に多数の反復を実行することによって得られる解と、(2) 同じ数の反復を 1 つずつ実行することによって得られる解の違いを観察します。両方のバージョンが同じ開始点を使用することに注意してください。レプリケートの数は 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

編集: 前に確認しなかったことの 1 つは、GMModel に使用される反復回数です (MaxIter が 100 に設定されている場合)。74回の反復後に停止しました。

GMModel.NumIterations
%ans =
%    74

一度に 1 回の反復に対する反復 74 での負の対数尤度は、100 MaxIter の負の対数尤度と同じです。反復 75 で、約 0.006 低下します。対数尤度が 1e-6 の許容範囲を超えて低下したときに、MaxIter 100 バージョンが反復 74 で停止したのはなぜですか?

4

1 に答える 1

1

The stopping is likely related to the convergence check in MATLAB/R201Xy/toolbox/stats/stats/@gmdistribution/private/gmcluster.m about halfway through in 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; 

where ll is set via [ll,post] = estep(log_lh);, but near the top of the function it sets

ll_old = -inf;

so when you run all at once, llDiff shrinks over the iterations but when you run one by one, it remains large and the convergence check always fails.

于 2016-05-21T19:29:33.167 に答える