matlab中的EM算法生成混合高斯分布的代码
时间: 2024-01-04 13:04:28 浏览: 81
高斯混合建模的期望最大化 (EM) 算法附matlab代码.zip
以下是在MATLAB中使用EM算法生成混合高斯分布的示例代码:
```matlab
% 生成数据
rng(0);
mu1 = [1 2];
sigma1 = [2 0; 0 0.5];
data1 = mvnrnd(mu1,sigma1,100);
mu2 = [-3 -5];
sigma2 = [1 0; 0 1];
data2 = mvnrnd(mu2,sigma2,100);
data = [data1;data2];
% 初始化参数
K = 2; % 高斯分布数量
[N,d] = size(data);
w = ones(K,1)/K; % 混合系数
mu = [mean(data) + randn(1,d) ; mean(data) + randn(1,d)]; % 均值
sigma = repmat(eye(d),[1,1,K]); % 方差
R = zeros(N,K); % 贡献度
% EM算法迭代
max_iter = 100;
for iter=1:max_iter
% E步骤:计算每个数据点属于每个高斯分布的概率
for k=1:K
R(:,k) = w(k)*mvnpdf(data,mu(k,:),sigma(:,:,k));
end
R = R./sum(R,2);
% M步骤:更新参数
Nk = sum(R,1);
w = Nk/N;
for k=1:K
mu(k,:) = sum(R(:,k).*data)/Nk(k);
diff = data - mu(k,:);
sigma(:,:,k) = (diff.*repmat(R(:,k),[1,d]))'*diff/Nk(k);
end
% 计算对数似然函数
llh(iter) = sum(log(sum(R,2)));
if iter>1 && abs(llh(iter)-llh(iter-1))<1e-6
break;
end
end
% 可视化结果
figure;
scatter(data(:,1),data(:,2));
hold on;
for k=1:K
plot_gaussian_ellipsoid(mu(k,:),sigma(:,:,k),'-');
end
title('EM算法生成的混合高斯分布');
```
其中,`data`表示输入数据,`K`表示高斯分布数量,`w`、`mu`和`sigma`分别表示混合系数、均值和方差,`R`表示每个数据点属于每个高斯分布的概率,`llh`表示对数似然函数。在代码中,使用了`mvnpdf`函数计算多元高斯分布的概率密度,`plot_gaussian_ellipsoid`函数用于可视化高斯分布的椭圆形状。
阅读全文