EM算法及MATLAB实现
时间: 2024-06-13 13:09:08 浏览: 104
EM算法是一种迭代算法,用于在给定观测数据和隐变量模型的情况下估计模型参数。它通常用于无监督学习,例如聚类和概率密度估计。EM算法的基本思想是通过迭代来估计模型参数,每次迭代包括两个步骤:E步骤和M步骤。在E步骤中,根据当前的参数估计值,计算每个观测数据属于每个隐变量的概率。在M步骤中,根据E步骤计算出的概率,重新估计模型参数。重复执行这两个步骤,直到收敛为止。
以下是基于MATLAB实现EM算法的示例代码:
```matlab
% 生成数据
mu1 = [1 2];
sigma1 = [2 0; 0 0.5];
mu2 = [-3 -5];
sigma2 = [1 0; 0 1];
X = [mvnrnd(mu1, sigma1, 100); mvnrnd(mu2, sigma2, 100)];
% 初始化参数
k = 2;
[n, d] = size(X);pi = ones(1, k) / k;
mu = [mean(X) + randn(1, d); mean(X) + randn(1, d)];
sigma = repmat(eye(d), [1, 1, k]);
% EM算法迭代
max_iter = 100;
tol = 1e-6;
llh = -inf(1, max_iter);
for iter = 1:max_iter
% E步骤
for i = 1:k
temp(i, :) = pi(i) * mvnpdf(X, mu(i, :), sigma(:, :, i));
end
gamma = temp ./ sum(temp, 2);
% M步骤
nk = sum(gamma, 1);
pi = nk / n;
for i = 1:k
mu(i, :) = gamma(:, i)' * X / nk(i);
X_centered = X - mu(i, :);
sigma(:, :, i) = (X_centered' * (repmat(gamma(:, i), [1, d]) .* X_centered)) / nk(i);
end
% 计算对数似然函数值
llh(iter) = sum(log(sum(temp, 2)));
if iter > 1
if abs(llh(iter) - llh(iter - 1)) < tol * abs(llh(iter - 1))
break;
end
end
end
% 可视化结果
figure;
plot(X(:, 1), X(:, 2), 'k.');
hold on;
ezcontour(@(x, y)pdf(mixGaussEst([x y], mu, sigma, pi)), [-10 10], [-10 10]);
title('EM算法聚类结果');
```
阅读全文