我正在尝试在高斯混合模型上实现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)中出错。