当前位置: 首页 > news >正文

基于MATLAB的高斯混合模型(GMM)实现

基于MATLAB的高斯混合模型(GMM)实现,包含自动生成混合数据、EM算法实现及可视化模块:


一、核心代码

1. 数据生成模块

function [X, trueParams] = generateGMMData(N, K, dim)% 生成混合高斯数据% 输入:%   N: 总样本数%   K: 高斯分量数%   dim: 数据维度% 输出:%   X: 生成的数据矩阵 (dim x N)%   trueParams: 真实参数结构体rng(0); % 固定随机种子trueParams = struct();% 随机生成参数trueParams.weights = rand(1,K);trueParams.weights = trueParams.weights / sum(trueParams.weights);trueParams.means = 10*randn(dim,K);trueParams.covs = repmat(eye(dim), [1,1,K]);for k=1:KtrueParams.covs(:,:,k) = trueParams.covs(:,:,k) * (0.5 + 0.5*rand);end% 生成数据X = zeros(dim,N);for k=1:KNk = round(N*trueParams.weights(k));X(:,(1:Nk)+(k-1)*Nk) = mvnrnd(trueParams.means(:,k), trueParams.covs(:,:,k), Nk);end
end

2. GMM-EM算法实现

function [mu, cov, weight, logLik] = gmm_em(X, K, maxIter, tol)% 输入:%   X: 数据矩阵 (dim x N)%   K: 高斯分量数%   maxIter: 最大迭代次数%   tol: 收敛阈值% 输出:%   mu: 均值矩阵 (dim x K)%   cov: 协方差矩阵 (dim x dim x K)%   weight: 权重向量 (1 x K)%   logLik: 对数似然序列[dim, N] = size(X);logLik = zeros(maxIter,1);% 初始化参数mu = 10*randn(dim,K);cov = repmat(eye(dim), [1,1,K]);weight = ones(1,K)/K;% 预计算对数权重logWeight = log(weight);for iter=1:maxIter% E步:计算后验概率logPost = zeros(N,K);for k=1:KlogPost(:,k) = logWeight(k) + log_mvnpdf(X, mu(:,k), cov(:,:,k));endlogSum = logsumexp(logPost, 2);post = exp(logPost - logSum);% M步:更新参数Nk = sum(post,1);weight = Nk/N;for k=1:Kmu(:,k) = (X * post(:,k)) / Nk(k);diff = X - mu(:,k);cov(:,:,k) = (diff * diag(post(:,k)) * diff') / Nk(k);% 正则化协方差矩阵cov(:,:,k) = (cov(:,:,k) + cov(:,:,k)')/2 + 1e-6*eye(dim);end% 计算对数似然logLik(iter) = sum(logsumexp(logPost,2));% 检查收敛if iter > 1 && abs(logLik(iter)-logLik(iter-1)) < tollogLik = logLik(1:iter);break;endend
endfunction y = log_mvnpdf(X, mu, Sigma)% 计算多元高斯分布对数概率密度[dim,N] = size(X);X_centered = X - mu;[R, p] = chol(Sigma);if p ~= 0y = -inf(1,N);return;endy = -0.5 * sum((X_centered/R).^2, 1) - 0.5*dim*log(2*pi) - sum(log(diag(R)));
endfunction s = logsumexp(x, dim)% 稳定计算log-sum-expx_max = max(x,[],dim);s = x_max + log(sum(exp(x - x_max), dim));
end

二、完整示例Demo

1. 数据生成与可视化

% 生成数据
N = 1000; % 总样本数
K = 3;    % 高斯分量数
[X, trueParams] = generateGMMData(N, K, 2);% 可视化原始数据
figure;
scatter(X(1,:), X(2,:), 10, 'filled');
hold on;
for k=1:Kplot(trueParams.means(1,k), trueParams.means(2,k), 'kx', 'MarkerSize', 15, 'LineWidth', 2);
end
title('原始数据分布');
hold off;

2. 模型训练

% 设置参数
maxIter = 100;
tol = 1e-5;% 运行EM算法
[mu, cov, weight, logLik] = gmm_em(X, K, maxIter, tol);% 显示训练结果
disp('估计参数:');
disp('均值:');
disp(mu');
disp('协方差:');
disp(cov(:,:,1));
disp(['对数似然: ', num2str(logLik(end))]);

3. 结果可视化

% 绘制等高线
figure;
hold on;
scatter(X(1,:), X(2,:), 10, 'filled');
[x1, x2] = meshgrid(linspace(min(X(1,:)), max(X(1,:)),50), ...linspace(min(X(2,:)), max(X(2,:)),50));
X_grid = [x1(:)'; x2(:)'];
post = zeros(size(X_grid,2), K);% 计算后验概率
for k=1:Kpost(:,k) = weight(k) * mvnpdf(X_grid', mu(:,k), cov(:,:,k));
end
post = post ./ sum(post,2);% 绘制概率密度等高线
contour(x1, x2, reshape(post(:,1), size(x1)), [0.01,0.1,0.5,1], 'LineColor', 'r');
contour(x1, x2, reshape(post(:,2), size(x1)), [0.01,0.1,0.5,1], 'LineColor', 'g');
contour(x1, x2, reshape(post(:,3), size(x1)), [0.01,0.1,0.5,1], 'LineColor', 'b');
title('GMM概率密度估计');
hold off;

三、关键优化策略

1. 协方差矩阵正则化

% 在M步更新协方差时添加正则化
cov(:,:,k) = (diff * diag(post(:,k)) * diff') / Nk(k) + 1e-6*eye(dim);

2. 并行计算加速

% 使用parfor加速E步计算
parfor k=1:KlogPost(:,k) = logWeight(k) + log_mvnpdf(X, mu(:,k), cov(:,:,k));
end

3. 收敛性增强

% 添加参数变化监控
mu_prev = mu;
for iter=1:maxIter% ... M步更新参数 ...if norm(mu - mu_prev, 'fro') < tolbreak;endmu_prev = mu;
end

四、性能评估

% 计算估计误差
trueMu = trueParams.means;
estMu = mu;trueCov = trueParams.covs;
estCov = cov;% 均值误差
mu_err = mean(sqrt(sum((trueMu - estMu).^2, 1)));% 协方差误差
cov_err = mean(vecnorm(trueCov(:) - estCov(:)));disp(['均值平均误差: ', num2str(mu_err)]);
disp(['协方差平均误差: ', num2str(cov_err)]);

五、扩展应用场景

1. 图像分割

% 加载图像
img = imread('peppers.png');
img_gray = rgb2gray(img);
img_double = im2double(img_gray);% 将图像转换为数据矩阵
[X_img, Y_img] = meshgrid(1:size(img_double,2), 1:size(img_double,1));
X_img = X_img(:);
Y_img = Y_img(:);
img_data = [X_img, Y_img]';% 运行GMM聚类
K = 5;
[mu_img, cov_img, weight_img, ~] = gmm_em(img_data, K, 100, 1e-5);% 生成分割结果
segmented = reshape(mode(bsxfun(@plus, mu_img', cov_img(:,:,1)), 2), size(img));
imshow(label2rgb(segmented));

2. 语音特征聚类

% 加载语音MFCC特征
load('mfcc_data.mat'); % 假设包含1000个20维MFCC特征向量% 运行GMM聚类
K = 10;
[mu, cov, weight, ~] = gmm_em(mfcc_data, K, 200, 1e-5);% 计算软分类
post = zeros(size(mfcc_data,2), K);
for k=1:Kpost(:,k) = weight(k) * mvnpdf(mfcc_data', mu(:,k), cov(:,:,k));
end
post = post ./ sum(post,2);

六、注意事项

  1. 初始化策略:建议先用K-means初始化均值

    [idx, kmeans_mu] = kmeans(X', K);
    mu = kmeans_mu';
    
  2. 维度灾难:高维数据建议使用对角协方差矩阵

    cov(:,:,k) = diag(diag(cov(:,:,k))); % 强制对角
    
  3. 数值稳定性:计算概率密度时使用对数域

    log_prob = log_mvnpdf(X, mu, cov);
    

七、参考

  1. Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.
  2. Murphy, K. P. (2012). Machine Learning: A Probabilistic Perspective. MIT Press.
  3. 代码 matlab 实现GMM——EM算法 www.youwenfan.com/contentcsk/63293.html
  4. MathWorks官方网页:fitgmdist函数说明
http://www.rkmt.cn/news/31510.html

相关文章:

  • 2025年连接器厂家权威推荐榜:USB连接器,电池连接器,TYPE-C连接器,防水TYPE-C/USB连接器专业制造商深度解析
  • 2025年定制阁楼货架厂家推荐排行榜,重型阁楼货架,轻型阁楼货架,仓储阁楼货架,车间阁楼货架公司精选
  • 2025年专业的齿轮磁力泵厂家最新TOP排行榜
  • 2025年热门的束带机束带厂家最新推荐权威榜
  • 【IEEE出版、往届见刊后1个月检索】第二届图像处理、多媒体技术与机器学习国际学术会议(IPMML 2025)
  • 2025年专业的打磨除尘设备TOP品牌厂家排行榜
  • 2025年激光SLAM导航AGV厂家权威推荐榜:自主导航AGV、智能搬运机器人、仓储物流AGV系统源头企业深度解析
  • 2025年优秀的梯形排水沟滑模机行业内知名厂家排行榜
  • 2025年专业的阳台壁挂太阳能厂家推荐及选购指南
  • 2025年比较好的煤炭化验设备厂家最新实力排行
  • 2025年10月三聚氰胺饰面板公司前十强推荐与专业选择指南
  • 2025年10月销量第一证明机构对比榜:尚普与华信人全维度解析
  • 2025 最新换热器厂家推荐榜:不锈钢 / 石墨 / 钛材等多类型设备领军品牌权威测评揭晓
  • 2025年比较好的正极电动搬运车用户好评厂家排行
  • 2025年10月洗碗机品牌推荐:海信领衔全维榜
  • 2025年10月遗产继承律师推荐榜:五强胜诉率与口碑全对比
  • 2025年北京租赁合同纠纷律师权威推荐榜单:遗产赠予/合同买卖/房产合同专业律师团队精选
  • 2025无缝钢管厂家推荐榜:天津大无缝钢铁领衔,Q345B/C 无缝钢管、高压合金管优质供应商精选
  • C# Web开发教程(九)标识框架[Identity]
  • 2025NFC与电子标签推荐榜:深圳中签科技领跑,NFC 标签/芯片/卡、电子芯片/标签高效应用方案精选
  • 2025年有实力冷拔丝优质厂家推荐榜单
  • 2025-10-27 在浏览器打开网站A输入数字后变成小动物,其他网站为正常数字输入 ==》 修改字体
  • 2025年比较好的破碎机TOP实力厂家推荐榜
  • IO出pin
  • 2025年诚信的万级净化工程厂家推荐及采购指南:定制定做公司
  • 2025年质量好的不锈钢电力设备厂家实力及用户口碑排行榜
  • 2025年知名的低速逆止器最新TOP厂家排名
  • laya spine事件
  • 2025 年集成墙板厂家最新推荐榜,深度剖析企业技术实力与市场口碑集成墙板快装 / 集成墙板全屋 / 集成墙板装饰公司推荐
  • 国产化Excel开发组件Spire.XLS教程:使用Python将CSV转换为XML(处理现实数据问题)