2016-05-21 23 views
1

Ich entwerfe einen neuen Algorithmus, der den EM-Algorithmus teilweise ausführen muss. Ich verwende dafür den MATLAB (R2015b) fitgmdist.GMM von fitgmdist in MATLAB gibt verschiedene Ergebnisse, wenn alle Iterationen gleichzeitig oder iterativ ausgeführt werden.

Ich beobachte einen Unterschied zwischen den Lösungen, die erhalten werden, indem (1) eine große Anzahl von Iterationen auf einmal ausgeführt wird und (2) die gleiche Anzahl von Iterationen nacheinander ausgeführt wird. Beachten Sie, dass beide Versionen den gleichen Startpunkt verwenden, die Anzahl der Replikate wird auf 1 (Standard) gesetzt, der RegularizationValue wird auf den Standardwert (0) gesetzt.

Woher kommt der Unterschied? Hier

ist der Code, der das Problem demonstriert:

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 

EDIT: Eine Sache, die ich vorher nicht überprüfen war die Anzahl der Iterationen für GMModel verwendet (wenn MaxIter auf 100 gesetzt). Es blieb nach 74 Iterationen stehen.

Die negative Log-Likelihood bei Iteration 74 für eine Iteration zu einer Zeit ist dieselbe wie die von 100 MaxIter. Bei Iteration 75 fällt es um ~ 0,006 ab. Es stellt sich also eine weitere Frage, warum die MaxIter 100-Version bei Iteration 74 gestoppt hat, wenn die Log-Likelihood um mehr als die Toleranz 1e-6?

Antwort

1

Das Anhalten wahrscheinlich auf die Konvergenz Prüfung in MATLAB/R201Xy/toolbox/stats/stats/@gmdistribution/private/gmcluster.m etwa in der Mitte in gmcluster_learn zusammenhängt:

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

wo ll über [ll,post] = estep(log_lh); gesetzt ist, aber in der Nähe der Spitze der Funktion setzt es

ll_old = -inf; 

Wenn Sie also alle auf einmal ausführen, schrumpft llDiff über die Iterationen, aber wenn Sie einzeln ausgeführt werden, bleibt es groß und die Konvergenzprüfung schlägt immer fehl.

+0

+1 für die Antwort. Die effektive Toleranz ist also 0, wenn MaxIter 1 ist. Ich habe auch festgestellt, dass die Toleranz relativ berechnet wird, d. H. Multipliziert mit abs (11), so dass sie für 1> 1 <1e-6 ist. Vielen Dank –