当 运行 所有迭代一次或迭代时,MATLAB 中 fitgmdist 的 GMM 给出不同的结果
GMM by fitgmdist in MATLAB gives different results when running all iterations at once or iteratively
我正在设计一个需要部分 运行 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 版本在对数似然下降超过 1e-6 的公差时停止在迭代 74?
停止可能与 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
会在迭代中缩小,但是当你 运行 一个一个地缩小时,它仍然很大并且收敛检查总是失败。
我正在设计一个需要部分 运行 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 版本在对数似然下降超过 1e-6 的公差时停止在迭代 74?
停止可能与 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
会在迭代中缩小,但是当你 运行 一个一个地缩小时,它仍然很大并且收敛检查总是失败。