Matlab中高斯混合模型的EM算法

时间:2016-11-15 22:48:29

标签: algorithm matlab image-processing machine-learning computer-vision

我正在尝试在高斯混合模型上实现EM算法用于聚类问题。我生成两个高斯的混合,然后尝试学习两个高斯的参数。我正在遵循给定here的教程我的实施代码如下:

clc;clear;
rng(1); % For reproducibility
MU1 = [1 2];
SIGMA1 = [2 0; 0 .5];
MU2 = [-3 -5];
SIGMA2 = [1 0; 0 1];
num = 2000;
X = [mvnrnd(MU1,SIGMA1,num/2);mvnrnd(MU2,SIGMA2,num/2)];

scatter(X(:,1),X(:,2),10,'.')

%%%initial values of parameters

%mu1 = [0.5 1];
%mu2 = [-2 -4];
mu1 = MU1;
mu2 = MU2;

%sigma1 = cov(X);
%sigma2 = sigma1;
sigma1 = SIGMA1;
sigma2 = SIGMA2;

%prior probabilities 
phi1 = 0.5;
phi2 = 0.5;

iter = 10;

   for i = 1:iter 

   %%%Expectation

   prob1 =   mvnpdf(X,mu1,sigma1); 
   %prob2 =   mvnpdf(X,mu2,sigma2); 
   prob2 =   1-prob1;
   probc1 = ( phi1*prob1 ) ./ ( (phi1*prob1)+ (phi2*prob2) );
   probc2 = 1 - probc1;
   %probc2 = ( phi1*prob2 ) ./ ( (phi1*prob1)+ (phi2*prob2) );

   %%%Maximization

   phi1 =  ( sum(probc1) )/num;
   phi2 =  ( sum(probc2) )/num;


   uvec1 = sum([probc1 probc1].*X,1);
   uvec2 = sum([probc2 probc2].*X,1);

   diff1 = X - repmat(uvec1,num,1);
   diff2 = X - repmat(uvec2,num,1);

   prod1 = (diff1')*(diff1.*[probc1 probc1]);
   prod2 = (diff2')*(diff2.*[probc2 probc2]);

   sig1  =  prod1/sum(prob1); 
   sig2  =  prod2/sum(prob2);

   %update
   mu1 = uvec1;
   mu2 = uvec2;

   sigma1 = sig1;
   sigma2 = sig2;

   end

即使在使用算法的实际均值和协方差之后,结果也与原始结果无关。(在单独的尝试中我使用了注释值)。 现在,我相信我可能在多变量高斯混合的矩阵运算中出错了。虽然我得到了具有正确维度的均值向量和协方差矩阵,但算法仍然不起作用。我以前使用相同的教程来实现EM对于单变量高斯混合物。

请帮我识别我可能做错的任何矩阵运算或任何算法步骤?

P.S。在几次迭代中它也在mvnpdf中给出了错误,因为sigma1或sigma2不是方形,对称,正定矩阵。是否有可能在某个阶段下溢导致整个问题?

PPS 好的,所以我正在努力纠正prod1,prod2术语我认为我应该尝试分两步进行(i)协方差乘法(ii)加权和总结矩阵。我是可能在步骤(ii)中出错。

0 个答案:

没有答案