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?
+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 –