本文共 1656 字,大约阅读时间需要 5 分钟。
function [Alpha, Mu, Sigma] = GMM_EM(Data, Alpha0, Mu0, Sigma0)
%% EM迭代停止条件
loglik_threshold = 1e-10;
%%初始化参数
[dim, N] = size(Data);
M = size(Mu0,2);
loglik_old = -realmax;
nbStep = 0;
Mu = Mu0;
Sigma = Sigma0;
Alpha = Alpha0;
Epsilon = 0.0001;
while (nbStep < 1200)
nbStep = nbStep+1;
%% E-步骤%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:M
% PDF of each point
Pxi(:,i) = GaussPDF(Data, Mu(:,i), Sigma(:,:,i));
end
%计算后验概率beta(i|x)
Pix_tmp = repmat(Alpha,[N 1]).*Pxi;
Pix = Pix_tmp ./ (repmat(sum(Pix_tmp,2),[1 M])+realmin);
Beta = sum(Pix);
%% M-步骤%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:M
%更新权值
Alpha(i) = Beta(i) / N;
%更新均值
Mu(:,i) = Data*Pix(:,i) / Beta(i);
%更新方差
Data_tmp1 = Data - repmat(Mu(:,i),1,N);
Sigma(:,:,i) = (repmat(Pix(:,i)',dim, 1) .* Data_tmp1*Data_tmp1') / Beta(i);
%% Add a tiny variance to avoid numerical instability
Sigma(:,:,i) = Sigma(:,:,i) + 1E-5.*diag(ones(dim,1));
end
% %% Stopping criterion 1 %%%%%%%%%%%%%%%%%%%%
% for i=1:M
%Compute the new probability p(x|i)
% Pxi(:,i) = GaussPDF(Data, Mu(:,i), Sigma(i));
% end
%Compute the log likelihood
% F = Pxi*Alpha';
% F(find(F
% loglik = mean(log(F));
%Stop the process depending on the increase of the log likelihood
% if abs((loglik/loglik_old)-1) < loglik_threshold
% break;
% end
% loglik_old = loglik;
%% Stopping criterion 2 %%%%%%%%%%%%%%%%%%%%
v = [sum(abs(Mu - Mu0)), abs(Alpha - Alpha0)];
s = abs(Sigma-Sigma0);
v2 = 0;
for i=1:M
v2 = v2 + det(s(:,:,i));
end
if ((sum(v) + v2) < Epsilon)
break;
end
Mu0 = Mu;
Sigma0 = Sigma;
Alpha0 = Alpha;
end
nbStep麻烦大神帮忙看下,这个是我找到的高斯混合模型的代码, 但是上面%%% Stopping criterion 1 %%%%%%%%%%%%%%%%%%%% 及其以下代码, 前面应不应该加% 这个符号呢,文中是加了的,但是我觉得加了%不就成注释了?
转载地址:https://blog.csdn.net/weixin_28871097/article/details/115928652 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!