高斯混合模型

article/2025/10/12 9:05:19

一、什么是高斯混合模型(GMM)

 高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,通常用于解决同一集合下的数据包含多个不同的分布的情况,如解决分类情况

 如下图,明显分成两个聚类。这两个聚类中的点分别通过两个不同的正态分布随机生成而来。如果只用一个的二维高斯分布来描述图中的数据。这显然不太合理,毕竟肉眼一看就应该分成两类

 

 但使用两个二维高斯分布来描述图中的数据,将两个二维高斯分布\(N(\mu_1,\sum_1),N(\mu_2,\sum_2)\)做线性组合,用线性组合后的分布来描述整个集合中的数据。这就是高斯混合模型(GMM)

二、GMM原理

 设有随机变量\(X\),则混合高斯模型可以这样表示: 

\(p(x) = \sum_{k=1}^{K}\pi_kN(x|\mu_k,\sum_k)\)

 其中\(N(x|\mu_k,\sum_k)\)称为混合模型中的第k个分量(component)。如前面图中的例子,有两个聚类,可以用两个二维高斯分布来表示,那么分量数K=2,\(\pi_k\)是混合系数(mixture coefficient),且满足:

\( \sum_{k=1}^{K}\pi_k,0\leq\pi_k\leq 1 \),其中\(\pi_k\)相当于每个高斯分布的权重

 

 GMM用于聚类时,假设数据服从混合高斯分布(Mixture Gaussian Distribution),例如上图的例子,很明显有两个聚类,可以定义K=2,那么对应的GMM形式如下:

\( p(x) = \pi_1N(x|\mu_1,\sum_1) + \pi_2N(x|\mu_2,\sum_2) \)

 

 上式中未知参数有六个:\((\pi_1,\mu_1,\sum_1, \pi_2,\mu_2,\sum_2)\),GMM聚类时分为两步,第一步是随机地在这K个分量中选一个,每个分量被选中的概率即为混合系数\(\pi_k\),可以设定\(\pi_1=\pi_2=0.5\),表示每个分量被选中的概率是0.5,即从中抽出一个点,这个点属于第一类的概率和第二类的概率各占一半。但实际应用中事先指定\(\pi_k\)的值是很笨的做法:当从图中的集合随机选取一个点,怎么知道这个点是来自\(N(x|\mu_1,\sum_1)\)还是\(N(x|\mu_2,\sum_2)\)呢?

 换言之怎么根据数据自动确定\(\pi_1,\pi_2\)的值?这就是GMM参数估计的问题。要解决这个问题,可以使用EM算法。通过EM算法,我们可以迭代计算出GMM中的参数:\(\pi_k,\mu_k,\sum_k\)

 

 我们目的是找到这样一组参数,它所确定的概率分布生成这些给定的数据点的概率最大,而这个概率实际上就等于:\(\prod_{i=1}^{N}p(x_i)\),我们把这个乘积称作似然函数 (Likelihood Function)。我们通常会对其取对数,把乘积变成加和:\(\sum_{i=1}^{N}logp(x_i)\),得到 log-likelihood function 。接下来将这个函数最大化(通常的做法是求导并令导数等于零,然后解方程),我们就认为这是最合适的参数,这样就完成了参数估计的过程。下面让我们来看一看 GMM 的 log-likelihood function :

\(\sum_{i=1}^{N}log\{\sum_{i=1}^{K}\pi_kN(x_i|\mu_k,\sum_k)\}\)

 

 由于上式太复杂,没法直接用求导求得最大值。为了解决这个问题,我们采取之前从 GMM 中随机选点的办法:分成两步

 

  1.估计每个数据由每个 Component 生成的概率(并不是每个 Component 被选中的概率):对于每个数据\(x_i\)来说,它由第\(k\)个 Component 生成的概率为:

   由于式子里的\(\mu_k,\sum_k\)也是需要我们估计的值,我们采用迭代法,在计算\(\gamma(i,k)\)的时候我们假定\(\mu_k,\sum_k\)均已知,我们将取上一次迭代所得的值(或者初始值)

 

  2.估计每个Component 的参数:现在我们假设上一步中得到的\(\gamma(i,k)\)就是正确的"数据\(x_i\)由Component \(k\)生成的概率",亦可以当做该Component 在生成这个数据上所做的贡献,或者说,我们可以看作\(x_i\)这个数据其中有\(\gamma(i,k)x_i\)这部分是由Component \(k\)所生成的,集中考虑所有的数据点,现在实际上可以看作Component 生成了\( \gamma(1,k)x_1,...,\gamma(N,k)x_N \)这些点,由于每个 Component 都是一个标准的 Gaussian 分布,可以很容易求出最大似然所对应的参数值: 

   其中\(N_k = \sum_{i=1}^{N}\gamma(i,k)\),并且\(\pi_k\)也顺理成章地可以估计\(N_k/N\)

 

  3.重复迭代前面两步,直到似然函数的值收敛为止

 

三、代码实例

 参考:https://blog.csdn.net/u014157632/article/details/65442165

'''
此示例程序随机从4个高斯模型中生成500个2维数据,真实参数:
混合项w=[0.1,0.2,0.3,0.4]
均值u=[[5,35],[30,40],[20,20],[45,15]]
协方差矩阵∑=[[30,0],[0,30]]
然后以这些数据作为观测数据,根据EM算法来估计以上参数
此程序未估计协方差矩阵'''import math
import copy
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Diter_num = 1000
N = 500
k = 4
probility = np.zeros(N)u1 = [5, 35]
u2 = [30, 40]
u3 = [20, 20]
u4 = [45, 15]sigma = np.matrix([[30, 0], [0,30]])
alpha = [0.1, 0.2, 0.3, 0.4]#生成随机数据,4个高斯模型
def generate_data(sigma, N, mu1, mu2, mu3, mu4, alpha):global X#可观测数据集X = np.zeros((N, 2))#X:2维数据,N个样本X = np.matrix(X)global mu#随机初始化mu1,mu2,mu3,mu4mu = np.random.random((4, 2))mu = np.matrix(mu)global excep#期望:第i个样本属于第j个模型的概率的期望excep = np.zeros((N, 4))global alpha_#初始化混合项系数alpha_ = [0.25, 0.25, 0.25, 0.25]#np.random.multivariate_normal():用于根据实际情况生成一个多元正态分布矩阵for i in range(N):if np.random.random(1) < 0.1:X[i, :] = np.random.multivariate_normal(mu1, sigma, 1)elif 0.1 <= np.random.random(1) < 0.3:X[i, :] = np.random.multivariate_normal(mu2, sigma, 1)elif 0.3 <= np.random.random(1) < 0.6:X[i, :] = np.random.multivariate_normal(mu3, sigma, 1)else:X[i, :] = np.random.multivariate_normal(mu4, sigma, 1)print('可观测数据:\n', X)print('初始化的mu1, mu2, mu3, mu4:', mu)def e_step(sigma, k, N):global Xglobal muglobal excepglobal alpha_for i in range(N):denom = 0for j in range(0, k):denom += alpha_[j] * math.exp(-0.5 * (X[i,:]-mu[j,:])*sigma.I*np.transpose(X[i,:]-mu[j,:]))/np.sqrt(np.linalg.det(sigma))#分母for j in range(0, k):numer = math.exp(-0.5 * (X[i,:]-mu[j,:])*sigma.I*np.transpose(X[i,:]-mu[j,:]))/np.sqrt(np.linalg.det(sigma))#分子excep[i, j] = alpha_[j] * numer / denom#求期望print('隐藏变量:\n', excep)def m_step(k, N):global excepglobal Xglobal alpha_for j in range(0, k):denom = 0#分母numer = 0#分子for i in range(N):numer += excep[i, j] * X[i, :]denom += excep[i, j]mu[j, :] = numer / denom #求均值alpha_[j] = denom / N#求混合项系数generate_data(sigma, N, u1, u2, u3, u4, alpha)#迭代计算
for i in range(iter_num):err = 0#均值误差err_alpha = 0#混合系数误差Old_mu = copy.deepcopy(mu)Old_alpha = copy.deepcopy(alpha_)e_step(sigma, k, N)#E 步m_step(k, N)#M 步print("迭代次数:", i+1)print("估计的均值:", mu)print("估计的混合项系数:", alpha_)for z in range(k):err += (abs(Old_mu[z, 0] - mu[z, 0]) + abs(Old_mu[z, 1] - mu[z, 1]))#计算误差err_alpha += abs(Old_alpha[z] - alpha_[z])if (err <= 0.001) and (err_alpha < 0.001):#达到精度退出迭代print(err, err_alpha)break#可视化结果,画生成的原始数据
plt.subplot(221)
plt.scatter(X[:,0].tolist(), X[:,1].tolist(),c='b', s=25, alpha=0.4, marker='o')
plt.title('random generated data')#画分类好的数据
plt.subplot(222)
plt.title('classified data through EM')
order = np.zeros(N)
color = ['b', 'r', 'k', 'y']
for i in range(N):for j in range(k):if excep[i, j] == max(excep[i, :]):order[i] = j#选出X[i, :]属于第几个高斯模型probility[i] += alpha_[int(order[i])] * math.exp(-0.5 * (X[i,:]-mu[j,:])*sigma.I*np.transpose(X[i,:]-mu[j,:]))/(np.sqrt(np.linalg.det(sigma))*2*np.pi)#计算混合高斯分布plt.scatter(X[i, 0], X[i, 1], c=color[int(order[i])], s=25, alpha=0.4, marker='o')#绘制分类后的散点图#绘制三维图像
ax = plt.subplot(223, projection='3d')
plt.title('3d view')
for i in range(N):ax.scatter(X[i,0], X[i, 1], probility[i], c=color[int(order[i])])
plt.show()

 

转载于:https://www.cnblogs.com/always-fight/p/9327418.html


http://chatgpt.dhexx.cn/article/GQgHkfuY.shtml

相关文章

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

本文原作者&#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;当系统提示我放入第二张光盘的时候&…

umount卸载磁盘_如何使用umount命令在Linux,Ubuntu,CentOS中卸载磁盘

umount卸载磁盘 Linux distributions like Ubuntu, Debian, CentOS, RHEL, and others use disks by mounting them to the file system. We have already examined mount command in the following tutorial. In this tutorial we will learn how to umount the disk in a Lin…