EM算法训练GMM的Matlab实现过程(总结) 转
标签:
股票 |
http://hi.csdn.net/attachment/201203/22/0_1332405780Ca7a.gif转" />
http://hi.csdn.net/attachment/201203/22/0_1332405834jwwg.gif转" />
其中M为混合高斯数,n为训练的样本数
假设现在有训练样本data集合,每一列为一个样本,行数代表样本的特征维数,采用Matlab实现EM算法的训练过程如下:
-
%演示EM训练算法的实现过程
-
clc;
-
clear
all; -
load
data; -
[dim,Num]=size(data);
-
max_iter=10;%最大迭代次数
-
min_improve=1e-4;%
提升的精度 -
Ngauss=3;%混合高斯函数个数
-
Pw=zeros(1,Ngauss);%保存权重
-
mu=
zeros(dim,Ngauss);%保存每个高斯分类的均值,每一列为一个高斯分量 -
sigma=
zeros(dim,dim,Ngauss);%保存高斯分类的协方差矩阵 -
fprintf('采用K均值算法对各个高斯分量进行初始化\n');
-
[cost,cm,cv,cc,cs,map]
= vq_flat(data, Ngauss);%聚类过程 map:样本所对应的聚类中心 -
mu=cm;%均值初始化
-
for
j=1:Ngauss -
gauss_labels=find(map==j);%找出每个类对应的标签 -
Pw(j)= length(gauss_labels)/length(map);%类别为1的样本个数占总样本的个数 -
sigma(:,:,j) = diag(std(data(:,gauss_labels),0,2)); %求行向量的方差,只取对角线,其他特征独立,并将其赋值给对角线 -
end
-
-
last_loglik
= -Inf;%上次的概率 -
%
采用EM算法估计GMM的各个参数 -
if
Ngauss==1,%一个高斯函数不需要用EM进行估计 -
sigma(:,:,1) = sqrtm(cov(data',1)); -
mu(:,1) = mean(data,2); -
else
-
sigma_i = squeeze(sigma(:,:,:)); -
-
iter= 0; -
for iter = 1:max_iter -
%E 步骤 -
%求每一样样本对应于GMM函数的输出以及每个高斯分量的输出, -
sigma_old=sigma_i; -
%E步骤。。。。。 -
for i=1:Ngauss -
P(:,i)= Pw(i) * p_single(data, squeeze(mu(:,i)), squeeze(sigma_i(:,:,i)));%每一个样本对应每一个高斯分量的输出 -
end -
s=sum(P,2);% -
for j=1:Num -
P(j,:)=P(j,:)/s(j); -
end -
%%%Max步骤 -
Pw(1:Ngauss) = 1/Num*sum(P);%权重的估计 -
%均值的估计 -
for i=1:Ngauss -
sum1=0; -
for j=1:Num -
sum1=sum1+P(j,i).*data(:,j); -
end -
mu(:,i)=sum1./sum(P(:,i)); -
end -
-
%方差估计按照公式类似 -
%sigma_i -
if((sum(sum(sum(abs(sigma_i- sigma_old)))) -
break; -
end -
-
-
end -
-
-
end
子函数:
-
function
p = p_single(x, mu, sigma) -
-
%返回高斯函数的值
-
-
[dim,N]=size(x); -
p=zeros(1,N); -
for i=1:N -
p(i)= 1/(2*pi*abs(det(sigma)))^(length(mu)/2)*exp(-0.5*(x(:,i)-mu)'*inv(sigma)*(x(:,i)-mu)); -
end
注明:鉴于大家都要求vq_flat代码,这里就不一一发送到邮箱了,提供下载地http://download.csdn.net/detail/xiaoding133/5501211

加载中…