用EM算法求解高斯混合模型
来源:互联网 发布:家具三维设计软件 编辑:程序博客网 时间:2024/05/19 18:14
本文从高斯混合模型出发,引出EM算法,最后回归到利用EM算法求解高斯混合模型。理论部分力求详尽不留证明疑点,所以略显冗长。实验部分给出了生成高斯混合分布样本和利用EM算法求解高斯混合模型的matlab代码。
理论部分
高斯混合模型(GMM)
顾名思义,高斯混合模型就是由多个高斯分布混合构成的模型。
这里,
为
直观来看,高斯混合分布可以看做下面分步过程的整合:
第一步,以
第二步,利用第
为了讨论方便,记
这里,
EM算法
从分步角度来看,求解高斯混合模型的难点在于,我们不知道一个样本
如果将
这里式(2)中的优化问题就对应了EM算法中的M步。另一方面,E步指的就是利用旧的模型参数
对于EM算法中的M步的目标函数,在《PRML》和Ng的讲义中分别用两种形式来表达,下面的命题表明两种形式是等价的。注意到
Proposition 1.
Pf.
窃以为式(3)中左式(PRML中的写法)简洁抽象,适合做理论推导;右式(Ng讲义中的写法)表达具体,适合指导算法实践。
EM算法求解高斯混合模型
具体应用到GMM模型中,EM算法中的M步我们要求解
注意到
这里,
令
接下来,我们在没有
解得
这里
然后,我们对
利用KKT条件:
解得
可以看到
综上所述,可得整个算法如下:
实验部分
生成数据
此步用matlab生成服从高斯混合分布的数据。
%参数区,可自行调整K = 3; %高斯模型个数dim = 3; %数据维度N = 1000; %生成的样本个数step = 4; %不同高斯模型均值之间的距离%变量区Phi = cell(K,1); %混合系数构成的cellArrayMu=cell(K,1); %均值向量构成的cellArraySigma = cell(K,1); %协方差矩阵构成的cellArrayDat = zeros(N,dim+1); %数据矩阵,其中最后一个维度为标签for i =1:K Phi(i)={1/K}; %默认每个模型的选择系数相同,可自行调整endMu(1) = {ones(dim,1)};for i =2:K t = rand(dim,1); t = t/norm(t,2)*step; Mu(i)={Mu{i-1}+t};endfor i =1:K t = rand(dim); t = orth(t); tt = rand(dim,1); Sigma(i) = {t'*diag(tt)*t};end%这里直接按系数比例生成样本,与直接按照高斯混合分布生成的样本大致是类似的cnt = 0;for i = 1:K if i == K n = N-cnt; else n = round(N*Phi{i}); end t = mvnrnd(Mu{i}, Sigma{i}, n); Dat(cnt+1:cnt+n,:) = [t ones(n, 1)*i]; cnt = cnt+n;end%存储数据部分save('Dat.mat', 'Dat');%画图部分close all;view(3);hold on;grid on;mycolor = colorcube(20);cnt = 0;for i = 1:K if i == K n = N-cnt; else n = round(N*Phi{i}); end t = Dat(cnt+1:cnt+n,:); plot3(t(:,1), t(:,2), t(:,3), '.', 'Color', mycolor(i,:)); cnt = cnt+n;endhold off;
EM算法求解GMM
利用EM算法求解GMM的过程中涉及到参数初始化问题,比较高效的做法是利用Kmeans先做聚类,再把每一类样本的比例,均值和协方差矩阵作为初始参数,再利用EM算法进行微调。如果想观察EM算法求解GMM的收敛行为,可以使用随机初始化参数。在下面的代码中,我们利用迭代前后对数似然函数的相对偏差作为判断其是否收敛。
function []=main() close all; Eps = 1e-4; %当迭代前后两次对数似然函数值的相对偏差小于Eps时算法结束 flag = false; %是否使用kmeans初始化参数 load('Dat.mat'); %导入数据,Dat为N*(dim+1)维的矩阵,每行最后一个元素为其隐变量取值(实验中没有用到) N = size(Dat, 1); %样本个数 dim = size(Dat, 2)-1; %数据维度 K = max(Dat(:,dim+1)); %高斯模型个数 %初始化参数部分 if flag %用kmeans初始化参数 [PhiBar, MuBar, SigmaBar] = initByKmeans(Dat(:,1:dim), K); else %随机初始化参数 PhiBar = cell(K,1); MuBar=cell(K,1); SigmaBar = cell(K,1); rPhi = rand(3,1); rPhi = rPhi/(ones(1, 3)*rPhi); for k=1:K PhiBar(k) = {rPhi(k)}; MuBar(k) = {mean(Dat(:,1:dim))'.*(1+rand(dim, 1)*1)}; SigmaBar(k) = {eye(dim)}; end end logLikeBar = calLogLike(Dat(:,1:dim), K, PhiBar, MuBar, SigmaBar); %计算初始对数似然函数值 Phi= cell(K,1); Mu=cell(K,1); Sigma = cell(K,1); %EM算法 cnt = 0; while true %E step: Gamma = zeros(N, K); for i = 1:N Xi = Dat(i,1:dim)'; Pxi = 0; for k = 1:K Pxi = Pxi+PhiBar{k}*mvnpdf(Xi, MuBar{k}, SigmaBar{k}); end for k = 1:K Gamma(i,k) = PhiBar{k}*mvnpdf(Xi, MuBar{k}, SigmaBar{k})/Pxi; end end %M step: N_k = ones(1,N)*Gamma; for k=1:K Phi(k) = {N_k(k)/N}; mu = zeros(dim, 1); for i = 1:N mu = mu+Gamma(i,k)*Dat(i,1:dim)'; end Mu(k) = {mu/N_k(k)}; sigma = zeros(dim); for i = 1:N sigma = sigma+Gamma(i,k)*(Dat(i,1:dim)'-Mu{k})*(Dat(i,1:dim)-Mu{k}'); end Sigma(k) = {sigma/N_k(k)}; end cnt = cnt+1; logLike = calLogLike(Dat(:,1:dim), K, Phi, Mu, Sigma); relGap = abs(logLike-logLikeBar)/abs(logLikeBar); disp(['Iteration: ', num2str(cnt), ' RelativeGap: ', sprintf('%.6f LogLikelihood %.6f', relGap, logLike)]); logLikeBar = logLike; %绘图部分% figure(cnt);% view(3);% hold on;% grid on;% mycolor = colorcube(20);% for i = 1:N% postP = 0;% choose = 0;% for k = 1:K %利用后验概率最大化准则% temp = Phi{k}*mvnpdf(Dat(i,1:dim)', Mu{k}, Sigma{k});% if temp > postP% postP = temp;% choose = k;% end% end% plot3(Dat(i,1), Dat(i,2), Dat(i,3),'.', 'Color', mycolor(choose,:), 'markersize', 4);% end% for k =1:K% plot3(Mu{k}(1), Mu{k}(2), Mu{k}(3), 'k.', 'markersize', 15);% end% saveas(gcf,sprintf('%d.jpg', cnt)); if relGap < Eps break; end PhiBar = Phi; MuBar = Mu; SigmaBar = Sigma; endendfunction [Phi, Mu, Sigma] = initByKmeans(X, K) %Kmeans随机初始化参数 N = size(X,1); dim = size(X,2); Phi= cell(K,1); Mu=cell(K,1); Sigma = cell(K,1); for k=1:K Phi(k) = {0}; Mu(k) = {zeros(dim, 1)}; Sigma(k) = {zeros(dim)}; end [idx, C] = kmeans(X, K); for k = 1:K Mu{k} = C(k,:)'; end for i = 1:N k = idx(i); Phi{k} = Phi{k}+1; Sigma{k} = Sigma{k}+(X(i,:)'-Mu{k})*(X(i,:)-Mu{k}'); end for k=1:K Sigma{k}= Sigma{k}/Phi{k}+1e-6*ones(dim); Phi{k} = Phi{k}/N; endendfunction [logLike] = calLogLike(X, K, Phi, Mu, Sigma) %计算对数似然函数值 logLike = 0; N = size(X,1); for i =1:N p = 0; for k = 1:K p = p+Phi{k}*mvnpdf(X(i,:)', Mu{k}, Sigma{k}); end logLike = logLike+log(p); endend
参考文献
Christopher M.. Bishop. Pattern recognition and machine learning. pp. 430-459
Andrew Ng. Machine Learning Lecture Notes.
- EM算法求解高斯混合模型
- 用EM算法求解高斯混合模型
- 机器学习--EM算法求解高斯混合模型
- 采用EM算法求解高斯混合模型参数
- 吴恩达 EM算法翻译 混合高斯的EM求解
- 混合高斯模型和EM算法
- 高斯混合模型和EM算法
- EM算法_混合高斯模型
- EM算法与混合高斯模型
- 高斯混合模型EM算法
- EM算法与混合高斯模型
- 高斯混合模型EM算法
- 斯坦福大学机器学习——EM算法求解高斯混合模型
- GMM高斯混合模型学习笔记(EM算法求解)
- 斯坦福大学机器学习——EM算法求解高斯混合模型
- 斯坦福大学机器学习——EM算法求解高斯混合模型
- EM算法求解混合伯努利模型
- 第13节-混合高斯模型,混合贝叶斯模型,因子分析及其EM求解
- ViewPager刷新无效
- mysql存储过程语法及实例
- Struts2入门(一)
- 进程通信之pipe通信
- jzoj P1663【AHOI2009】维护序列
- 用EM算法求解高斯混合模型
- 获取 request 中 json 参数数据
- 移动端弹出穿透问题(弹出层弹出后body还能滑动)
- mac电脑双开微信的方法
- flask 源码阅读
- JS正则表达式大全
- 部分sublime快捷键
- PA0 REPORT
- AbstractQueuedSynchronizer的实现分析