高斯混合模型matlab代码
时间: 2023-10-04 20:13:50 浏览: 60
以下是一个简单的高斯混合模型的MATLAB代码示例:
```matlab
% 生成一些模拟数据
x = [randn(100,2)+ones(100,2); randn(100,2)-ones(100,2)];
% 初始化高斯混合模型
k = 2; % 高斯分布的数量
[m, n] = size(x);
mu = x(randperm(m,k),:);
sigma = repmat(eye(n),1,1,k); % 初始方差矩阵为单位矩阵
alpha = ones(1,k)/k; % 初始权重为均匀分布
% 训练高斯混合模型
tol = 1e-6; % 收敛容差
max_iter = 100; % 最大迭代次数
llh = -inf(1,max_iter); % 记录对数似然值
for iter = 1:max_iter
% E-step
gamma = zeros(m,k);
for j = 1:k
gamma(:,j) = alpha(j)*mvnpdf(x,mu(j,:),sigma(:,:,j));
end
gamma = bsxfun(@rdivide,gamma,sum(gamma,2));
% M-step
nk = sum(gamma,1);
alpha = nk/m;
for j = 1:k
mu(j,:) = gamma(:,j)'*x/nk(j);
sigma(:,:,j) = bsxfun(@times, gamma(:,j)'*(x-mu(j,:)), eye(n)) / nk(j);
end
% 计算对数似然值
llh(iter) = sum(log(sum(bsxfun(@times,alpha,mvnpdf(x,mu,sigma))),2));
if iter > 1
if abs(llh(iter)-llh(iter-1)) < tol*abs(llh(iter-1)); break; end
end
end
% 可视化结果
figure;
plot(llh(1:iter),'o-');
xlabel('迭代次数');
ylabel('对数似然值');
title('收敛过程');
figure;
plot(x(:,1),x(:,2),'bo');
hold on;
ezcontour(@(x1,x2) pdf(mvnpdf([x1 x2],mu,sigma),alpha), ...
[min(x(:,1))-1 max(x(:,1))+1 min(x(:,2))-1 max(x(:,2))+1]);
plot(mu(:,1),mu(:,2),'ro');
legend('数据点','高斯分布','均值');
title('高斯混合模型');
```