matlab中的EM算法生成混合高斯分布的代码
时间: 2024-01-04 14:04:28 浏览: 94
高斯混合建模的期望最大化 (EM) 算法附matlab代码.zip
以下是 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` 函数用于计算多元高斯分布密度函数值。在代码中,我们使用随机初始值对算法进行初始化,然后进行迭代更新直到收敛。最终,我们绘制出每个样本点属于每个分量的后验概率,并绘制出每个分量的均值和等高线。
阅读全文