公司动态

机器学习系列:高斯混合模型(2)

📅 2026/8/12 20:11:02
机器学习系列:高斯混合模型(2)
上一篇给出了用EM算法拟合单变量高斯混合模型的过程这一篇着重讨论EM算法拟合多变量高斯混合模型过程。EM算法拟合单变量高斯混合模型和多变量高斯混合模型步骤基本相同只是多变量高斯混合模型中正态分布模型中的参数均值向量和协方差矩阵是多维的其参数迭代式的推导过程略显复杂。这里主要涉及到矩阵求导公式。一、多元正态分布多元正态分布(多变量高斯分布)是单维正态分布向多维空间的推广‌常用来描述多个随机变量的联合分布情况其核心由均值向量和协方差矩阵决定 。‌‌一个d维随机向量服从多元正态分布记作其非奇异情况下的概率密度函数为这里是d为随机变量,是 均值向量是协方差矩阵。多元正态分布作为单变量正态分布在高维空间的延伸凭借其数学性质的便利性在统计分析、机器学习等诸多领域都有广泛应用。 多维高斯混合模型中用多个不同参数的多元正态分布去拟合整个数据集每个分布对应一个聚类簇。它可以灵活适配不同形状、不同密度的数据簇相比K-Means能处理更复杂的非球形分布数据在用户分群、图像语义分割、语音信号分离等场景中广泛使用。二、EM算法拟合多维高斯混合模型多变量高斯混合模型Multivariate Gaussian Mixture Model, MGMM 是一种概率统计模型假设数据由 M个多元高斯分布正态分布线性组合而成。它不仅能处理多维特征间的‌相关性‌还能通过“软聚类”描述数据点属于不同簇的概率适用于复杂多峰分布的建模。‌‌其中的参数包括混合权重表示第 j个分量的混合权重满足均值向量决定第 j个高斯分量的中心位置; 协方差矩阵一个对称正定矩阵描述第j个分量内各维度的方差及变量间的相关性决定分布椭球的形状和方向)。‌‌依照在机器学习EM算法一文中介绍的通用EM算法框架我们可以将其应用于多维高斯混合模型的参数估计。EM算法通过迭代执行E步期望步和M步最大化步来求解含有隐变量的模型参数其核心思想是在不完全数据下通过引入隐变量这里指数据点属于哪个高斯分量的期望来最大化完整数据的对数似然函数。对于多维高斯混合模型其参数估计过程与单变量情形在步骤上基本一致但具体到每个分量的均值向量和协方差矩阵的更新公式由于涉及多维矩阵运算和求导推导过程更为复杂。下面我们将详细展开多维高斯混合模型EM算法的具体步骤和参数迭代公式。假设有一个样本集,这些数据看起来有M个峰类于是可以用如下高斯混合模型拟合这些数据则似然函数为对应的对数似然函数是如果直接对上式的参数(权重均值向量及协方差矩阵)求偏导并令其为 0由于对数与求和无法交换顺序导数方程中参数相互耦合‌很难得到参数的显式解析解。如果采用EM 算法通过引入‌适当的隐变量‌表示样本属于哪个高斯分量可以将复杂的优化问题分解为两个可解步骤E 步和M 步)使难解问题转化为一系列易解的子问题‌保证每次迭代后对数似然函数单调递增直至收敛到局部最优解。为此引入隐变量, 它表示当前样本数据是属于哪个类其所有的取值为:, 其中表示当前数据是属于第个高斯分布。设在EM算法中的参数估计已计算出的情况下Q函数为记隐变量的后验概率为利用贝叶斯公式:由联合密度函数与边缘密度函数条件概率密度函数的关系有于是Q函数重新整理为以下求函数的最值点。对于参数因为有约束条件由拉格朗日乘数法构造如下拉格朗日函数。拉格朗日函数对参数求偏导令 则在上式基础上考虑约束条件有则代入前面的式子得到参数的更新式对于向量参数, 求关于参数的偏导:令得参数的更新式对于矩阵参数, 求关于参数的偏导:这里由矩阵导数的运算公式有所以令并且注意到这里参数可以用已计算出的替代于是得到参数得更新式于是可以得到GMM模型多变量情况下的EM算法的基本步骤----------------------------------------多变量GMM模型EM算法------------------------------------------------------1 初始化模型参数2 对于每次迭代 t 0, 1, 2, 3, ... 直至收敛(2.1) E-step固定当前模型参数, 计算隐变量 z 的后验概率:(2.2) M-step基于E-step的结果 用下式更新模型参数3当参数更新的变化小于预设阈值或达到最大迭代次数时算法停止输出最终的参数估计。-------------------------------------------------------------------------------------------------------------------------------三、一个简单例子在MATLAB下编写程序来验证算法。例 1. 给定一组二元数据用二维高斯混合模型进行聚类。MATLAB中的函数gmdistribution可以在指定参数的情况下创建GMM模型。为验证本篇描述的算法我们先指定一组参数并由gmdistribution产生一个对应的GMM模型然后有该模型生成一组二元数据。以此数据为样本集用本篇列出的EM算法训练一个GMM模型。最后来对比该模型中的参数与之前给定的参数是否一致。首先在MATLAB中编写一个多变量高斯混合模型的函数function ymultGMMpdf(x,Alpha,Mu,Sigma) %多变量高斯混合模型 %********************************************************* % 输入: % x 1*1 一个样本 % Mu K*d 数组 (每一行为某类的均值,K为高斯分量数) % Sigma d*d*K 数组 (每一层为一类的协方差矩阵) % Alpha K*1列向量 (每一个数值为一类的权重(占比)) % 输出: % y 1*1 1个样本点对应的概率密度值 %********************************************************** [K,d]size(Mu); y0; if d1 for k1:K yyAlpha(k)*mvnpdf(x, Mu(k,:), Sigma(:,:,k)); end else disp(This is a multGMM!); end end然后给出隐变量的后验概率计算函数function WmultPosteriorGMM(X,Alpha,Mu,Sigma) %多变量高斯混合模型隐变量的后验概率 %********************************************************* %输入 % X N*1 样本集(N个样本) % Alpha: K*1 权重 % Mu: K*d 均值 % Sigma d*d*K 标准差 %输出 % W: N*K 后验概率 %********************************************************* [N,d]size(X); Ksize(Alpha,2); if d1 for i1:N smultGMMpdf(X(i,:),Alpha,Mu,Sigma); for k1:K W(i,k)Alpha(k)*mvnpdf(X(i,:),Mu(k,:),Sigma(:,:,k))/s; end end else disp(This is univariate GMM!); end end再给出EM算法的实现函数function [Alpha,Mu,Sigma]multEM_GMM(X,K) %用EM算法训练多变量高斯混合模型 % % X | N*d数组 | d维点坐标集 | % K | 数值 | 划分类别数量 | % ---------------------------------------------------------- % Mu | K*d数组 | 每一行为某类的坐标中心 | % Sigma | d*d*K数组 | 每一层为一类的协方差矩阵 | % alpha | K*1列向量 | 每一个数值为一类的权重(占比) | % ------------------------------------------------------------ [N,d]size(X); % N:元素个数, d:维数 %%%%%%%%%%%%%%%%%%%%%%EM算法估计参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% %Initial Step: % %%%%%%%%%%%%%%%%%%%%%%%%% %一开始设置每一类有相同协方差矩阵和权重 Alpha_est(:,1:K)1/K; Sigma_est(:,:,1:K)repmat(cov(X),[1,1,K]); %依据各维度的最大最小值构建参数的初始值 tMinmin(X); tMaxmax(X); Mu_estrepmat(tMin,K,1)linspace(0,1,K)*(tMax-tMin); MaxIter1e5; for step1:MaxIter MuMu_est; SigmaSigma_est; AlphaAlpha_est; %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %E-Step: % %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %计算后验概率 WmultPosteriorGMM(X,Alpha_est,Mu_est,Sigma_est); %%%%%%%%%%%%%%%%%%%%% %M-Step: % %%%%%%%%%%%%%%%%%%%%% %alpha Swsum(W,1); Alpha_estSw/N; %mu for k1:K s0; for i1:N ssW(i,k)*X(i,:); end Mu_est(k,:)s/Sw(k); end %Sigma for k1:K Szeros(d,d); for i1:N SSW(i,k)*(X(i,:)-Mu_est(k,:))*(X(i,:)-Mu_est(k,:)); end Sigma_est(:,:,k)S/Sw(k); end % 收敛条件(计算均方根误差) r1sum((Mu-Mu_est).^2,all); r2sum((Sigma-Sigma_est).^2,all); r3sum((Alpha-Alpha_est).^2,all); Rmssqrt((r1r2r3)/(K*dd*d*KK)); %输出当前收敛情况 if Rms1e-5 stepMaxIter disp() disp([第,num2str(step),步EM算法收敛,均方根误差为,num2str(Rms)]) disp(各分量权重) disp(Alpha_est) disp(当前各类中心点) disp(Mu_est) disp(当前各类协方差矩阵) disp(Sigma_est) disp(----------------------------------) break; end disp( ) disp() disp([第,num2str(step),次EM算法参数估计完成]) disp(----------------------------------) disp([均方根误差:,num2str(Rms)]) disp(当前各类中心点) disp(Mu_est); end end最后在一个主函数中进行验证function mainForMultGMM() %% 生成样本集 %1.定义多变量GMM 参数 % 假设有两个分量 (K2)二维数据 (D2) Mu [1 2; -3 -5]; % 均值矩阵 2x2 Sigma cat(3, [2 0.5; 0.5 1], [1 0; 0 1]); % 协方差数组 2x2x2 Alpha [0.4 0.6]; % 混合权重和为1 % 2.创建 gmdistribution 对象 GMMmodel gmdistribution(Mu, Sigma, Alpha); % 3.生成随机样本 N 1000; [X, Idx1] random(GMMmodel, N); % 4.样本可视化 subplot(2,1,1); hold on scatter(X(find(Idx11),1), X(find(Idx11),2), 10, *); scatter(X(find(Idx12),1), X(find(Idx12),2), 10, ); title(Generated Samples from GMM); xlabel(x); ylabel(y); %% 用EM算法训练一个GMM模型 K2; %聚类个数 [Alpha_est,Mu_est,Sigma_est]multEM_GMM(X,K); %训练GMM模型 WmultPosteriorGMM(X,Alpha_est,Mu_est,Sigma_est); %计算后验概率 [~,Idx2]max(W,[],2); %归类 subplot(2,1,2); %样本聚类可视化 hold on scatter(X(find(Idx21),1), X(find(Idx21),2), 10, ); scatter(X(find(Idx22),1), X(find(Idx22),2), 10, *); title(Clustered the data used EM algorithm); xlabel(x); ylabel(y); end程序运行效果为从运行结果看拟合得到的混合参数均值向量和协方差矩阵都很接近原来设定的对应参数。