高斯混合模型GMM

article/2025/10/12 8:58:14

1. 高斯混合模型概念

        高斯混合模型(Gaussian Mixture Model)是一种聚类算法,它是多个高斯分布函数的线性组合,通常用于解决同一集合下的数据包含多种不同的分布情况。

2.高斯混合模型的一个例子

        在校园里随机抽取2000个学生,其中有男生也有女生,已知男女生的身高都服从高斯分布,这两个高斯分布的均值和方差我们不知道,另外,由于某种原因,我们也不知道这2000个人中有多少个男生有多少个女生,现在我们要求出这两个分布的均值和标准差,还有其权重。

        根据题目的需求,我们需要产生两个高斯分布序列,分别代表男女生的身高。需要注意的是,我们在产生序列的时候必须要在知道男女生各占多少的情况下进行随机生成。但是在求解的过程中,我们必须遵照题意,假设不知道男女生的人数和其各自的均值和方差。然后再对这混合后的2000人序列数据,进行不断地迭代,直到得到的均值和方差趋于平稳。
        

 在图中我们也可以看到,我们生成的女生身高f e m a l e femalefemale服从于N ( 160 , 16 ) N(160,16)N(160,16),男生身高m a l e malemale服从于N ( 180 , 30 ) N(180,30)N(180,30)。并且其matlab生成该随机序列的代码如下:
 

%绘制男女生身高的例子
clc
clear all
%男女生共取2000人,女生平均身高160,男生平均身高180
female=160+randn(1,821)*sqrt(16);
male=180+randn(1,1179)*sqrt(30);
people=[female male];
figure(1)
hist(people,150);%画出混合后的频率分布直方图
N=100;
figure(2)
hist(female,N);%画出生成的女性的频率分布直方图
h=findobj(gca,'Type','patch');
set(h,'facecolor','r');hold on;%设置柱形图颜色
hist(male,N);%画出生成的男性的频率分布直方图
title('某校男女生身高的分布直方图');
xlabel('身高/cm');ylabel('人数');hold off ;%坐标轴设置

接下来我们就需要对数据进行不断地迭代,从而使其得到两类分布的最优解。

2.1 初始化参数

对于首次迭代,我们需要提供一下,对于男女的均值方差以及权值之间的初始值设定,否则无法启动迭代。这里我们的初始值的设定,我们只需要我们生活中的常识对其进行一下赋初值即可。无需考虑太多。

        正如图上所画的,在以后的介绍中,μ ,sigma的颜色不同,代表了性别不同,此处我们以蓝色代表男生的,粉色代表女生的。例如我们在这里的,我假设男女生人数一样多,于是我就对初值进行了如下赋值:

%前提是不知道男女生分布的均值和方差的。
g_mu1=170;g_sigma1=10;g_w1=0.5;%男生的
g_mu2=160;g_sigma2=5;g_w2=0.5;%女生的

2.2 计算每个身高在男分布中的响应R 
 

 通过下面的公式,我们要对我们的2000个混合后的身高数据,利用我们刚刚赋的初值来计算一下每身高hi在男分布中的响应R。所以此处也就一共有2000个响应值。

        在这里或许大家会疑惑,公式中的g (hi∣μ , σ ) 代表的是啥,其实这是一维高斯函数的密度函数,对于我们的这个例子而言,其详细的表达式如下:

 好了计算完身高在男分布中的响应R ,我们再来计算一下在女分布中的响应R,其求解公式同理。

2.3 更新男女生分布的期望值μ

        由于之前的男女生的期望值μ都是我们凭着主观经验猜测的,所以我们需要对该值进行迭代更新,下面我先介绍男生身高期望值的更新公式。

 
2.4 更新男女生分布的方差σ 2 

        原因同上边一样,我们要通过如下公式更新一下男生分布的方差,其求解公式如下所示:

2.5 更新权值ω 1 , ω 2 

男生分布的权值的更新如下:

 类似的,女生分布的权值的更新如下:

3. matlab源码

3.1 迭代更新的函数封装(matlab)

        由于要使用不断迭代的方式来不断求取新的均值方差权值,以期使得迭代的结果更加接近真实值,于是我对于这部分的代码进行了一下封装,将其封装为一个loop.m文件。其内容具体如下:

文件名称:loop.m
function [ mu1_new,sigma1_new,w1_new,mu2_new,sigma2_new,w2_new ] = loop(male,female,g_mu1,g_sigma1,g_w1,g_mu2,g_sigma2,g_w2 )
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
%Step 1.首先根据经验来分别设置男女生的均值、方差和权值
% g_mu1=175;g_sigma1=10;g_w1=0.5;%男生的
% g_mu2=158;g_sigma2=10;g_w2=0.5;%女生的%Step 2. 
%计算男的身高在男分布中的响应R1i
%计算女的身高在男分布中的响应R2i
people=[female male];
R1=zeros(1,2000);
R2=zeros(1,2000);
for i=1:2000px1=g_w1*pdf('norm',people(i),g_mu1,g_sigma1);px2=g_w2*pdf('norm',people(i),g_mu2,g_sigma2);R1(i)=px1/(px1+px2);R2(i)=px2/(px1+px2);
end%Step 3.
%更新男、女生身高分布的期望musum1=0;
sum2=0;
for i=1:2000sum1=sum1+R1(i)*people(i);sum2=sum2+R2(i)*people(i);
end
sum11=sum(R1);
sum22=sum(R2);
mu1_new=sum1/sum11;%得出男生的新均值
mu2_new=sum2/sum22;%得出女生的新均值%Step 4.
%更新男、女生身高分布的标准差sigma
sum1=0;
sum2=0;
for i=1:2000sum1=sum1+R1(i)*(people(i)-mu1_new)^2;sum2=sum2+R2(i)*(people(i)-mu2_new)^2;
end
sigma1_new=(sum1/sum11)^0.5;%得出男生的新标准差
sigma2_new=(sum2/sum22)^0.5;%得出女生的新标准差%Step 5.
%更新权值
w1_new=sum11/2000;
w2_new=sum22/2000;end

3.2 主函数实现高斯混合模型GMM

该函数是实现整个这个实例的matlab代码主函数,其内容如下:

文件名称:GMM.m
%绘制男女生身高的例子
clc
clear all
%男女生各取2000人,女生平均身高163,男声平均身高180
female=160+randn(1,821)*sqrt(16);
male=180+randn(1,1179)*sqrt(30);
people=[female male];
figure(1)
hist(people,150);%画出混合后的频率分布直方图
N=100;
figure(2)
hist(female,N);%画出生成的女性的频率分布直方图
h=findobj(gca,'Type','patch');
set(h,'facecolor','r');hold on;%设置柱形图颜色
hist(male,N);%画出生成的男性的频率分布直方图
title('某校男女生身高的分布直方图');
xlabel('身高/cm');ylabel('人数');hold off ;%坐标轴设置%以下通过五个步骤开始构建高斯混合模型%Step 1.首先根据经验来分别设置男女生的均值、方差和权值
%前提是不知道男女生分布的均值和方差的。
g_mu1=170;g_sigma1=10;g_w1=0.5;%男生的
g_mu2=160;g_sigma2=5;g_w2=0.5;%女生的times=10;%设置迭代次数
result=zeros(times,6);%定义一个数组来存储每次的迭代结果
result(1,1)=g_mu1;result(1,2)=g_sigma1;%以下
result(1,3)=g_w1;result(1,4)=g_mu2;
result(1,5)=g_sigma2;result(1,6)=g_w2;%以上将result的第一行设置为初始值for i=1:times-1%调用自己的迭代函数loop来实现迭代计算[ mu11_new,sigma11_new,w11_new,mu22_new,sigma22_new,w22_new ]=loop(male,female,result(i,1),result(i,2),result(i,3),result(i,4),result(i,5),result(i,6));result(i+1,1)=mu11_new;result(i+1,2)=sigma11_new;result(i+1,3)=w11_new;%将每次迭代的结果存入resultresult(i+1,4)=mu22_new;result(i+1,5)=sigma22_new;result(i+1,6)=w22_new ;%当前迭代完成
end
result    % 输出每次迭代结果
figure(3)
%plot(result(:,3),'linewidth',1.5);%画出男生的权重迭代历史
xi=1:0.4:times;
xx=interp1(result(:,3),xi, 'spline');
plot(xx,'linewidth',1.5);%画出男生的权重迭代历史
hold on ;grid on;
yy=interp1(result(:,6),xi, 'spline');
plot(yy,'r','linewidth',1.5);%画出女生权重迭代历史
legend('男生权重变化','女生权重变化','location','northeast');%坐标轴设置
title('男女生权重随迭代次数的变化');
xlabel('迭代次数');ylabel('权重值');axis([1 times 0 1]);%坐标轴设置%开始分别求取出男女生的概率密度函数
%在刚刚的迭代结果中取出男女生的分别的mu和sigma
%男生而言需要求出mu1,sigma1,w1
%女生而言需要求取mu2,sigma2,w2
mu1=result(times,1);
sigma1=result(times,2);
mu2=result(times,4);
sigma2=result(times,5);
figure(4);
%画出男生的概率密度曲线
inter_x=linspace(140,210,500)';
inter_y=normpdf(inter_x,mu1,sigma1);
plot(inter_x,inter_y,'linewidth',1.5);
hold on;
%画出女生的概率密度曲线
inter_yy=normpdf(inter_x,mu2,sigma2);
plot(inter_x,inter_yy,'m','linewidth',1.5)
grid on;
legend('男生','女生');title('男女生身高的概率密度曲线');
xlabel('身高/cm');ylabel('概率');hold off;%坐标轴设置%%此部分开始画高斯混合模型的图像
x =140:0.1:210 ;
y1 = normpdf(x,mu1,sigma1);%定义第1个高斯密度曲线
y2 = normpdf(x,mu2,sigma2);%定义第2个高斯密度曲线
figure(5)
plot(x,y1,'--b','linewidth',1.5);%画出第1个高斯概率密度曲线的图像
hold on;
plot(x,y2,'--g','linewidth',1.5);%画出第2个高斯概率密度曲线的图像
title('两个一维高斯分布HMM模型');xlabel('X');ylabel('概率密度');
% axis([-8 10 0 0.5]);
grid on;%坐标轴设置
tex=text(180,0.1,'当前W1数值为:','FontSize',14,'FontWeight','demi');%图中显示权重
rate=result(:,3)%定义一个权重
c=colormap(lines(times));%定义times条不同颜色的线条
for i=1:timespause(0.1);%延时函数y3=rate(i)*y1+(1-rate(i))*y2%对两个高斯概率密度图像进行加权p2=plot(x,y3,'color',c(i,:),'linewidth',1.5);%绘画加权后的图像num=num2str(rate(i));%将当前第一个高斯概率所用的权重值转为字符串类型tex1=text(203,0.1,num,'FontSize',14,'FontWeight','demi','color','r');%显示当前权重值pause(0.3);%延时函数if(i<times)delete(tex1);%删除当前权重delete(p2);  %删除当前加权后图像end
end
hold off


http://chatgpt.dhexx.cn/article/4jqbQSpb.shtml

相关文章

高斯混合模型

一、什么是高斯混合模型&#xff08;GMM&#xff09; 高斯混合模型&#xff08;Gaussian Mixed Model&#xff09;指的是多个高斯分布函数的线性组合&#xff0c;通常用于解决同一集合下的数据包含多个不同的分布的情况&#xff0c;如解决分类情况 如下图&#xff0c;明显分成两…

【技术分享】高斯混合模型

本文原作者&#xff1a;尹迪&#xff0c;经授权发布。 原文链接&#xff1a;https://cloud.tencent.com/developer/article/1480731 导语&#xff1a;现有的高斯模型有单高斯模型&#xff08;SGM&#xff09;和高斯混合模型&#xff08;GMM&#xff09;两种。从几何上讲&#…

高斯混合模型(GMM)

高斯混合模型 k-means 聚类模型非常简单并且易于理解&#xff0c;但是它的简单性也为实际应用带 来了挑战。特别是在实际应用中&#xff0c;k-means 的非概率性和它仅根据到簇中心点的距离来指 派簇的特点将导致性能低下。这一节将介绍高斯混合模型&#xff0c;该模型可以被看…

机器学习笔记 - 什么是高斯混合模型(GMM)?

1、高斯混合模型概述 高斯混合模型 (GMM) 是一种机器学习算法。它们用于根据概率分布将数据分类为不同的类别。高斯混合模型可用于许多不同的领域,包括金融、营销等等!这里要对高斯混合模型进行介绍以及真实世界的示例、它们的作用以及何时应该使用GMM。 高斯混合模型 (GMM) …

机器学习算法(二十九):高斯混合模型(Gaussian Mixed Model,GMM)

目录 1 混合模型&#xff08;Mixture Model&#xff09; 2 高斯模型 2.1 单高斯模型 2.2 高斯混合模型 3 模型参数学习 3.1 单高斯模型 3.2 高斯混合模型 4 高斯混合模型与K均值算法对比 1 混合模型&#xff08;Mixture Model&#xff09; 混合模型是一个可以用来表示在总…

重启虚拟机异常:Unmount and run xfs_repair

重启虚拟机异常&#xff1a;Unmount and run xfs_repair 解决办法&#xff1a; 原因&#xff1a;看出来应该是sda3分区损坏&#xff0c;修复就可以了 1&#xff1a;启动虚拟机E进入单用户模式 2&#xff1a;在linux16开头的哪一行后面添加rd.break&#xff0c;ctrlx进入救援模式…

Unmount and run xfs_repair

开启虚拟机报错&#xff1a;Unmount and run xfs_repair 从错误可以查看到是vda3错误。 解决办法&#xff1a; 1、umount /dev/vda3 2、xfs_repair -L /dev/vda3 3、reboot 就ok了。

Linux mount/unmount命令

开机自动挂载 如果我们想实现开机自动挂载某设备&#xff0c;只要修改/etc/fstab文件即可。 文件挂载的配置文件&#xff1a;/etc/fstab 查看此文件可知 每行定义一个要挂载的文件系统&#xff1b; 其每行的格式如下 要挂载的设备或伪文件系统 挂载点 文件系统类型 挂载选项…

android.permission.MOUNT_UNMOUNT_FILESYSTEMS添加权限报错

<!--这是在sd卡内创建和删除文件权限--> <uses-permission android:name"android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name"android.permission.WRITE_SETTINGS" /> 出现报错有两种解决方法&#xff1…

Centos7 虚拟机非法关机导致系统无法启动报Unmount and run xfs_repair的解决方法

1&#xff0c;电脑不正常启动导致我的虚拟机无法启动&#xff0c;报以下错误Unmount and run xfs_repair&#xff0c;大概意思是xfs文件系统出现问题了&#xff0c;导致无法挂载&#xff0c;需要使用xfs_repair进行修复。 2&#xff0c;执行如下命令 xfs_repair /dev/mapper/c…

linux下unmount了移动硬盘之后,硬盘灯还是常亮并且硬盘还在一直转动

linux下unmount了移动硬盘之后&#xff0c;硬盘灯还是常亮并且硬盘还在一直转动 ​ 参考:https://www.zhihu.com/question/23362385 希捷2T移动硬盘 在windows下卸载硬盘之后硬盘灯就不亮了&#xff0c;手摸也没有震动感。 在ubuntu下卸载硬盘之后&#xff0c;硬盘灯仍然常…

centos7异常断电,重启提示Unmount and run xfs_repair

周末服务器由于阵列卡问题&#xff0c;异常重启&#xff0c;重启后前台异常报错&#xff0c;提示磁盘元数据问题&#xff0c;需要修复 如故障图所示&#xff0c;sdb1&#xff0c;sdf1&#xff0c;sdi1 3块磁盘出现问题&#xff0c; 下面的解决办法&#xff1a; 解决办法&…

Android/C/C++ 中解决 USB UnMount(禁止USB端口)

引&#xff1a;因为某些特殊需求&#xff0c;需要在某些设备接入车机的时候&#xff0c;动态UnMount USB设备&#xff0c;因为代码其中有一些方法是自定义过的&#xff0c;所以该文章仅供思路参考。 &#xff08;20200319 更新&#xff09;&#xff1a;在后续跟进中&#xff0…

linux移动硬盘unmount报错处理

备份数据用的移动硬盘unmount时报&#xff1a; 通过fuser命令来kill掉设备进程&#xff0c;再unmount移动设备 先看fuser命令帮助信息&#xff1a; [rootathenadb2 ~]# fuser -helpUsage: fuser [ -a | -s | -c ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME... [ - ] [ -n SPAC…

虚拟机 报错:Unmount and run xfs_repair

1&#xff0c;启动虚拟机的时候&#xff0c;摁 E 键 找到linux16 这一行(在fi下一行) 的最后&#xff0c;添加&#xff1a; rd.break 摁 &#xff1a;ctrlx进入救援模式 2&#xff0c;执行&#xff1a;umount /dev/sda3 xfs_repair -L /dev/sda3 …

VMware 安装Centos7 虚拟机 报Unmount and run xfs_repair

VMware 安装Centos7 虚拟机 报Unmount and run xfs_repair 问题描述 安装完虚拟机后重启无法进入用户登录界面 报错&#xff1a;Unmount and run xfs_repair 原因&#xff1a; dm-0分区损坏 解决办法 卸载目录 umount /dev/mapper/centos-root 修复目录 xfs_repair -L…

linux 开机遇见unmount and run xfs_repair

vmware 开机提示 看不懂反正提示 dm-0 没有正确挂载&#xff0c;需要修复 直接上干货执行如下两条命令 ls -l /dev/mapper xfs_repair /dev/mapper/cl_root 或是 xfs_repair -L /dev/mapper/cl_root echo $? 如果返回零&#xff0c;代表成功 最后重启服务器即可 init 6

Linux虚拟机(lvm)报Unmount and run xfs_repair

原因&#xff1a;因为突然断电&#xff0c;导致机器关闭 结果&#xff1a;发现有一台虚拟机无法启动&#xff0c;一直报错 Unmount and run xfs_repair 分析&#xff1a;主机异常掉电后里面的虚拟机无法启动&#xff0c;主要是损坏的分区 解决办法&#xff1a; 原因&#x…

Ubuntu远程装载硬盘Mount and unmount disk

小虎本来以为Ubuntu&#xff08;Linux系统&#xff09;不能够远程装载硬盘&#xff0c;每次重开机都要线下重新装载硬盘。但是苦于工作站不在身边&#xff0c;跑来跑去太麻烦&#xff0c;所以想远程装载一下。 解决方法 遍历搜索所有硬盘。找到对应名字。 lsblk创建一个文件…

mount unmount oracle,umount- 0506-349 Cannot unmount -dev-cd0- The requested reso

umount- 0506-349 Cannot unmount -dev-cd0- The requested reso (2011-12-21 04:20:37) 标签&#xff1a; requested 杂谈 umount: 0506-349 Cannot unmount /dev/cd0: The requested reso请问&#xff1a;我在安装oracle的时候&#xff0c;当系统提示我放入第二张光盘的时候&…