论文R语言复现 | 基于 EM 算法的高斯混合模型参数估计

高斯混合概率在众多领域都有重要应用,依据已知观测数据估计高斯模型中未知参数就显得尤为重要,由于观测值具体来自于高斯分布的哪个分模型是未知的,那么利用传统的极大似然( MLE) 方法进行参数估计就变得十分困难。引入 EM 算法,该方法通过构造分布已知的潜变量对模型进行参数估计,经过多次迭代优化可以使估计值逐渐逼近真实值。本文主要复现该篇文章的实证部分~

一、复现内容

在这里插入图片描述

在这里插入图片描述

二、复现代码

alpha_1<-0.5
alpha_2<-0.5
mu_1<-0.36
mu_2<-0.25
sigma_1<-1.4
sigma_2<-1.3

fi<-function(x,mu,sigma){
  y<-1/(sqrt(2*pi)*sigma)*exp(-(x-mu)**2/(2*sigma**2))
  return(y)
}

x<-c(0.900,-2.618,1.235,-0.382,0.850,0.443,0.444,0.185,1.502,1.071)


gauss_em<-function(x,alpha,mu,sigma){
  z<-alpha*fi(x,mu,sqrt(sigma))/(alpha_1*fi(x,mu_1,sqrt(sigma_1))+alpha_2*fi(x,mu_2,sqrt(sigma_2)))
  mu<-sum(z*x)/sum(z)
  sigma<-sum(z*((x-mu)**2))/sum(z)
  alpha<-mean(z)  
  parms<-list(alpha,mu,sigma)
  return(parms)
}

gauss_em(x,alpha_1,mu_1,sigma_1)  
gauss_em(x,alpha_2,mu_2,sigma_2)

alpha1_vec<-c()
alpha2_vec<-c()
mu1_vec<-c()
mu2_vec<-c()
sigma1_vec<-c()
sigma2_vec<-c()

for(i in 1:20){
  result_1<-gauss_em(x,alpha_1,mu_1,sigma_1)
  result_2<-gauss_em(x,alpha_2,mu_2,sigma_2)
  alpha_1<-result_1[[1]]
  mu_1<-result_1[[2]]
  sigma_1<-result_1[[3]]
  
  alpha_2<-result_2[[1]]
  mu_2<-result_2[[2]]
  sigma_2<-result_2[[3]]
  
  alpha1_vec<-c(alpha1_vec,alpha_1)
  alpha2_vec<-c(alpha2_vec,alpha_2)
  mu1_vec<-c(mu1_vec,mu_1)
  mu2_vec<-c(mu2_vec,mu_2)
  sigma1_vec<-c(sigma1_vec,sigma_1)
  sigma2_vec<-c(sigma2_vec,sigma_2)
  
}



em_rst<-data.frame(alpha1_vec,alpha2_vec,
                   mu1_vec,mu2_vec,sigma1_vec,sigma2_vec)
em_rst


plot_rst<-function(x,xlab,title){
  plot(1:20,
       x,
       type='o',
       xlab=xlab,
       main=title,
       xaxt='n',
       col='red')
  axis(1,1:20)
}

par(mfrow=c(2,3))
params_names<-c("alpha1","alpha2","mu1","mu2","sigma1","sigma2")
params_list<-list(alpha1_vec,alpha2_vec,mu1_vec,mu2_vec,sigma1_vec,sigma2_vec)

for(i in 1:length(params_list)){
  plot_rst(params_list[[i]],
           params_names[i],
           paste0('EM算法——',params_names[i],'迭代趋势'))
}

在这里插入图片描述
在这里插入图片描述

注意:论文表格中的 σ \sigma σ μ \mu μ 标记反了!

参考文章:
[1]梁盛楠.基于EM算法的高斯混合模型参数估计[J].黔南民族师范学院学报,2020,40(04):5-8.

  • 3
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是 MATLAB 中使用 EM 算法生成混合高斯分布的代码示例: ```matlab % 生成数据 rng(1); % 设置随机数种子,以便可复现性 mu_true = [-2 2; 2 -2]; % 真实均值 Sigma_true(:,:,1) = [2 0; 0 0.5]; Sigma_true(:,:,2) = [1 -0.8; -0.8 1]; % 真实方差 gm = gmdistribution(mu_true, Sigma_true, [0.4 0.6]); % 生成混合高斯分布 X = random(gm, 500); % 从混合高斯分布中生成 500 个样本 % EM 算法 k = 2; % 分量数 P = ones(k,1)/k; % 每个分量的先验概率 mu = randn(2,k); % 初始化均值 Sigma = repmat(eye(2),[1 1 k]); % 初始化方差 tol = 1e-6; % 迭代停止的阈值 maxiter = 1000; % 最大迭代次数 for iter = 1:maxiter % E 步骤 for j = 1:k % 计算后验概率 Pij(:,j) = P(j)*mvnpdf(X,mu(:,j)',Sigma(:,:,j)); end Pij = Pij./sum(Pij,2); % M 步骤 for j = 1:k % 更新先验概率、均值和方差 P(j) = sum(Pij(:,j))/size(X,1); mu(:,j) = sum(X.*Pij(:,j),1)/sum(Pij(:,j)); Sigma(:,:,j) = (X-repmat(mu(:,j)',size(X,1),1))'*diag(Pij(:,j))*(X-repmat(mu(:,j)',size(X,1),1))/sum(Pij(:,j)); end % 检查迭代是否收敛 if max(abs(Pij(:)-Pij_old(:))) < tol break; end Pij_old = Pij; end % 绘制结果 figure; scatter(X(:,1),X(:,2),10,Pij(:,1),'filled'); hold on; scatter(mu(1,:),mu(2,:),50,'k','filled'); contour(X1,X2,reshape(Pij(:,1),size(X1)),[0.1 0.25 0.5 0.75 0.9],'k'); scatter(X(:,1),X(:,2),10,Pij(:,2),'filled'); scatter(mu(1,:),mu(2,:),50,'k','filled'); contour(X1,X2,reshape(Pij(:,2),size(X1)),[0.1 0.25 0.5 0.75 0.9],'k'); ``` 其中,`gmdistribution` 函数用于生成混合高斯分布,`mvnpdf` 函数用于计算多元高斯分布密度函数值。在代码中,我们使用随机初始值对算法进行初始化,然后进行迭代更新直到收敛。最终,我们绘制出每个样本点属于每个分量的后验概率,并绘制出每个分量的均值和等高线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值