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

高斯混合模型参数估计 使用EM算法对一维或者高维的高斯混合模型GMM进行密度函数参数估计

高斯混合模型参数估计 使用EM算法对一维或者高维的高斯混合模型GMM进行密度函数参数估计,算法使用kmeans参数初始化,使用EM算法进行迭代求解 算法为Matlab编写,逻辑清晰,注释全面

直接上干货。咱们今天聊聊怎么用Matlab实现高斯混合模型(GMM)的参数估计,重点是用EM算法迭代求解。整个过程从kmeans初始化开始,手把手教你从零搭建一个能跑通的GMM模型。

先看参数初始化部分。这里用kmeans确定初始聚类中心,简单粗暴但有效:

function [mu, sigma, alpha] = init_params(data, K) [idx, centers] = kmeans(data, K); % K个聚类中心 mu = centers'; % 转置为列向量 sigma = zeros(1, 1, K); alpha = zeros(K, 1); for k = 1:K cluster_data = data(idx == k); sigma(:,:,k) = var(cluster_data); % 每个簇的方差 alpha(k) = sum(idx == k)/length(data); % 混合系数 end end

这段代码有意思的地方在于sigma的计算。注意三维数组的维度处理——虽然是一维数据,但保持高维扩展性。混合系数alpha直接按样本比例分配,这比随机初始化靠谱多了。

接下来是EM算法的核心循环。先看E步计算后验概率:

function gamma = e_step(x, mu, sigma, alpha) K = length(alpha); N = length(x); prob = zeros(N, K); for k = 1:K prob(:,k) = alpha(k) * normpdf(x, mu(k), sqrt(sigma(:,:,k))); end gamma = prob ./ sum(prob, 2); % 按行归一化 end

这里的gamma矩阵就是传说中的"责任值"。注意normpdf的参数处理——sigma需要开平方,很多新手会在这里踩坑。sum(prob,2)这个操作让每行的概率和为1,确保后验概率的合法性。

高斯混合模型参数估计 使用EM算法对一维或者高维的高斯混合模型GMM进行密度函数参数估计,算法使用kmeans参数初始化,使用EM算法进行迭代求解 算法为Matlab编写,逻辑清晰,注释全面

M步的参数更新才是重头戏:

function [mu_new, sigma_new, alpha_new] = m_step(x, gamma) [N, K] = size(gamma); mu_new = sum(gamma.*x) ./ sum(gamma); % 加权平均 sigma_new = zeros(1,1,K); for k = 1:K diff = x - mu_new(k); sigma_new(:,:,k) = (gamma(:,k)' * (diff.^2)) / sum(gamma(:,k)); end alpha_new = mean(gamma)'; % 直接取平均 end

mu的计算用了点乘技巧,比循环高效。sigma更新时注意保持维度一致性——这里故意用三维数组,方便后续扩展到多维情况。alpha更新简单到令人发指,就是各分量的平均责任值。

主函数把这几部分串起来:

function [mu, sigma, alpha, log_likelihood] = gmm_em(x, K, max_iter, tol) % 初始化 [mu, sigma, alpha] = init_params(x, K); prev_loglik = -inf; for iter = 1:max_iter % E步 gamma = e_step(x, mu, sigma, alpha); % M步 [mu, sigma, alpha] = m_step(x, gamma); % 计算似然值 log_likelihood = sum(log(sum(alpha' .* normpdf(x, mu', sqrt(sigma)), 2))); % 收敛判断 if abs(log_likelihood - prev_loglik) < tol break; end prev_loglik = log_likelihood; end end

这里有个小技巧:对数似然的计算避免了下溢问题。注意normpdf的参数排列方式,mu需要转置才能正确广播。收敛条件设为对数似然变化小于阈值,通常取1e-6左右就够用了。

实际跑代码时要注意几个坑:

  1. 方差可能坍缩到0——加个极小值做正则化
  2. K值选太大容易过拟合——用BIC准则选择
  3. 初始值影响大——可以多次随机初始化取最优

代码里故意保留了一些"不完美"的设计,比如直接用kmeans结果而没做多次尝试,这是为了保持代码的简洁性。实际工程中可能需要加入防止空簇的机制,比如当某个簇的样本数为零时重新初始化。

最后说个冷知识:Matlab自带的gmdistribution.fit其实就是用EM实现的,但自己撸代码的好处是可以随意魔改。比如想加个正则项防止过拟合,或者改收敛条件,自己写的代码就灵活多了。

http://www.cnnetsun.cn/news/1658206.html

相关文章:

  • 3分钟快速获取百度网盘提取码的完整指南
  • 计算机毕业设计springboot在线运营工单处理系统 基于SpringBoot的客户服务工单流转与协同处理平台 SpringBoot框架下的智能运维服务请求跟踪管理系统
  • 3个核心步骤实现Koikatu HF Patch的无缝集成解决方案
  • 保姆级教程:在Windows下用VSCode和STM32CubeProgrammer给Pixhawk4飞控烧写Bootloader
  • Inter字体技术解析与实用指南:解锁现代排版潜能
  • 拯救受损二维码:用QRazyBox实现高效恢复的4个实战策略
  • 从ZJUCTF那道‘简单’的PHP反序列化题,聊聊魔术方法链的实战利用(附完整EXP)
  • 别再只会上传一句话木马了!用DVWA File Upload模块,深入理解PHP文件上传漏洞的5个关键点
  • 新手必看:在快马平台上通过实例代码轻松理解rag核心原理
  • 从BLDC方波到PMSM FOC:如何让你的电机告别“颗粒感”实现丝滑旋转?
  • AI Coding Agent从入门到精通(非常详细),给个文件系统就够了,收藏这篇就够了!
  • 收藏!CRUD时代终结,后端开发者如何转型AI Agent架构师?
  • 保姆级教程:用Dio和GitCode API v5为你的Flutter应用添加用户与仓库搜索功能
  • 探索智能前沿:在快马平台用ai实现openclaw配置的预测与诊断
  • 别让FPGA拖后腿!深入拆解PCIe枚举过程与Xilinx器件配置优化全攻略
  • 2025届毕业生推荐的降AI率网站横评
  • UGUI开发中那些烦人的黄线到底是什么?手把手教你关闭Navigation可视化
  • # 实时数据查询优化实战
  • 【26年最新英语六级真题】2015-2025年12月英语六级历年真题及答案PDF电子版+六级核心词汇
  • OpenClaw 的模型服务是否支持自定义认证插件?
  • Pycharm调试卡在collecting data?3步搞定Gevent兼容模式(附原理详解)
  • javaweb网上零食商城销售系统
  • FPGA新手避坑:用Quartus Prime 23.1的FIFO IP核实现跨时钟域传输(附仿真代码)
  • python-langchain框架(1-8-2 缓存机制——验证缓存的效果)
  • 毕业设计实战:基于YOLOv8与LPRNet的端到端车牌识别系统(Python+PyTorch)
  • 2026届必备的降AI率平台横评
  • 5G NR帧结构与信道:从基础原理到实际应用
  • ICMP协议实战指南:从原理到网络诊断
  • 镜像视界|AI赋能智慧交通:人体无感定位驱动枢纽空间智能升级——基于多摄像机融合与三维轨迹重建的连续追踪与行为分析系统
  • 别再只改GRUB了!libfranka实时内核安装后,验证成功的完整流程(含默认启动项设置)