高斯混合模型的终极理解

高斯混合模型的终极理解高斯混合模型 GMM 是一个非常基础并且应用很广的模型 对于它的透彻理解非常重要 网上的关于 GMM 的大多资料介绍都是大段公式 而且符号表述不太清楚 或者文笔非常生硬 本文尝试用通俗的语言全面介绍一下 GMM 不足之处还望各位指正 首先给出 GMM 的定义这里引用李航老师 统计学习方法 上的定义 如下图 定义很好理解 高斯混合模型是一种混合模型 混合的基本分布是高斯分布而已 第一个细节 为什么系数之和为 0 PR

高斯混合模型GMM是一个非常基础并且应用很广的模型。对于它的透彻理解非常重要。网上的关于GMM的大多资料介绍都是大段公式,而且符号表述不太清楚,或者文笔非常生硬。本文尝试用通俗的语言全面介绍一下GMM,不足之处还望各位指正。

首先给出GMM的定义

这里引用李航老师《统计学习方法》上的定义,如下图:

这里写图片描述

定义很好理解,高斯混合模型是一种混合模型,混合的基本分布是高斯分布而已。

第一个细节:为什么系数之和为0?

PRML上给出过一张图:

这里写图片描述

这图显示了拥有三个高斯分量的一个维度的GMM是如何由其高斯分量叠加而成。这张图曾经一度对我理解GMM造成了困扰。因为如果是这样的话,那么这三个高斯分量的系数应该都是1,这样系数之和便为3,才会有这样直接叠加的效果。而这显然不符合GMM的定义。因此,这张图只是在形式上展现了GMM的生成原理而并不精确。

那么,为什么GMM的各个高斯分量的系数之和必须为1呢?

其实答案很简单,我们所谓的GMM的定义本质上是一个概率密度函数。而概率密度函数在其作用域内的积分之和必然为1。GMM整体的概率密度函数是由若干个高斯分量的概率密度函数线性叠加而成的,而每一个高斯分量的概率密度函数的积分必然也是1,所以,要想GMM整体的概率密度积分为1,就必须对每一个高斯分量赋予一个其值不大于1的权重,并且权重之和为1。

第二个细节:求解GMM参数为什么需要用EM算法

总所周知,求解GMM参数使用EM算法。但是为什么呢?这样是必须的吗?

首先,类似于其他的模型求解,我们先使用最大似然估计来尝试求解GMM的参数。如下:

这里写图片描述

这里写图片描述

可以看出目标函数是和的对数,很难展开,优化问题麻烦,难以对其进行求偏导处理。因此只能寻求其它方法。那就是EM算法。

第三个细节:求解GMM的EM算法隐变量的理解

使用EM算法必须明确隐变量。求解GMM的时候设想观测数据x是这样产生的:首选依赖GMM的某个高斯分量的系数概率(因为系数取值在0~1之间,因此可以看做是一个概率取值)选择到这个高斯分量,然后根据这个被选择的高斯分量生成观测数据。然后隐变量就是某个高斯分量是否被选中:选中就为1,否则为0。

按照这样的设想:隐变量是一个向量,并且这个向量中只有一个元素取值为1,其它的都是0。因为假设只有一个高斯分量被选中并产生观测数据。然而我们的GMM的一个观测数据在直观上应该是每个高斯分量都有产生,而不是由一个高斯分量单独生成,只是重要性不同(由系数控制)。那么,这样的隐变量假设合理吗?

答案是合理,只是理解起来比较“费劲”而已。

首先明确一点:GMM的观测数据是啥,GMM的函数结果又是啥。如果是一个一维的GMM,那么其观测数据就是任意一个实数。而GMM这个概率密度函数在输入这个观测数据之后输出的是这个实数被GMM产生的概率而已。

接着,现在我们不知道GMM具体的参数值,想要根据观测数据去求解其参数。而GMM的参数是由各个高斯分量的参数再加上权值系数组成的。那么我们就先假定,如果这个观测值只是由其中一个高斯分量产生,去求解其中一个高斯分量的参数。我们假设不同的观测值都有一个产生自己的唯一归宿,就像K-means算法一样。然后在后面的迭代过程中,根据数据整体似然函数的优化过程,逐渐找到一个最优的分配方案。然而,不同于K-means算法的是,我们最终给出的只是某一个观测是由某一个高斯分量唯一生成的概率值,而不是确定下来的属于某一类。每个高斯分量其实都可以产生这个观测数据只是输出不同而已,即产生观测数据的概率不同。最后,根据每个高斯分量产生观测数据的可能性不同,结合其权值汇总出整个GMM产生这个观测数据的概率值。

终极理解:使用EM算法求解GMM参数

1、定义隐变量

我们引入隐变量 γjk ,它的取值只能是1或者0。

  • 取值为1:第 j 个观测变量来自第

    k
    个高斯分量
  • 取值为0:第 j 个观测变量不是来自第

    k
    个高斯分量

那么对于每一个观测数据 yj 都会对应于一个向量变量 Γj={
γj1,...,γjK}
,那么有:

k=1Kγjk=1



p(Γj)=k=1Kαkγjk


其中, K 为GMM高斯分量的个数,

αk
为第 k 个高斯分量的权值。因为观测数据来自GMM的各个高斯分量相互独立,而

αk
刚好可以看做是观测数据来自第 k 个高斯分量的概率,因此可以直接通过连乘得到整个隐变量

Γj
的先验分布概率。

2、得到完全数据的似然函数

对于观测数据 yj ,当已知其是哪个高斯分量生成的之后,其服从的概率分布为:

p(yj|γjk=1;Θ)=N(yj|μk,Σk)


由于观测数据从哪个高斯分量生成这个事件之间的相互独立的,因此可以写为:

p(yj|Γj;Θ)=k=1KN(yj|μk,Σk)γjk


这样我们就得到了已知 Γj 的情况下单个观测数据的后验概率分布。结合之前得到的 Γj 的先验分布,则我们可以写出单个完全观测数据的似然函数为:

p(yj,Γj;Θ)=k=1KαkγjkN(yj|μk,Σk)γjk


最终得到所有观测数据的完全数据似然函数为:

p(y,Γj;Θ)=j=1Nk=1KαkγjkN(yj|μk,Σk)γjk


取对数,得到对数似然函数为:

lnp(y,Γj;Θ)=j=1Nk=1K(γjklnαk+γjklnN(yj|μk,Σk))

3、得到各个高斯分量的参数计算公式

首先,我们将上式中的 lnN(yj|μk,Σk) 根据单高斯的向量形式的概率密度函数的表达形式展开:

lnN(yj|μk,Σk)=D2ln(2π)12ln|Σk|12(yjμk)TΣ1k(yjμk)

假设我们已经知道隐变量 γjk 的取值,对上面得到的似然函数分别对 αk Σk 求偏导并且偏导结果为零,可以得到:

μk=Nj=1Kk=1γjkyjNj=1Kk=1γjk


Σk=Nj=1Kk=1γjk(yjμk)(yjμk)TNj=1Kk=1γjk


由于在上面两式的第二个求和符号是对 k=1…K 求和,而在求和过程中 γjk 只有以此取到1,其它都是0,因此上面两式可以简化为:

μk=Nj=1γjkyjNj=1γjk


Σk=Nj=1γjk(yjμk)(yjμk)TNj=1γjk


现在参数空间中剩下一个 αk 还没有求。这是一个约束满足问题,因为必须满足约束 ΣKk=1αk=1 。我们使用拉格朗日乘子法结合似然函数和约束条件对 αk 求偏导,可以得到:

αk=Nj=1γjkλ


将上式的左右两边分别对 k=1…K 求和,可以得到:

λ=N


λ 代入,最终得到:

αk=Nj=1γjkN


至此,我们在隐变量已知的情况下得到了GMM的三种类型参数的求解公式。

4、得到隐变量的估计公式
根据EM算法,现在我们需要通过当前参数的取值得到隐变量的估计公式也就是说隐变量的期望的表达形式。即如何求解 E{
γjk|y,Θ}



E{
γjk|y,Θ}=P(γjk=1|y,Θ)


=P(γjk=1,yj|Θ)Kk=1P(γjk=1,yj|Θ)


=P(yj|γjk=1,Θ)P(γjk=1|Θ)Kk=1P(yj|γjk=1,Θ)P(γjk=1|Θ)


=αkN(yj|μk,Σk)Kk=1αkN(yj|μk,Σk)

5、使用EM算法迭代进行参数求解
熟悉EM算法的朋友应该已经可以从上面的推导中找到EM算法的E步和M步。

GMM和K-means直观对比

最后我们比较GMM和K-means两个算法的步骤。

GMM:

  • 先计算所有数据对每个分模型的响应度
  • 根据响应度计算每个分模型的参数
  • 迭代

K-means:

  • 先计算所有数据对于K个点的距离,取距离最近的点作为自己所属于的类
  • 根据上一步的类别划分更新点的位置(点的位置就可以看做是模型参数)
  • 迭代

可以看出GMM和K-means还是有很大的相同点的。GMM中数据对高斯分量的响应度就相当于K-means中的距离计算,GMM中的根据响应度计算高斯分量参数就相当于K-means中计算分类点的位置。然后它们都通过不断迭代达到最优。不同的是:GMM模型给出的是每一个观测点由哪个高斯分量生成的概率,而K-means直接给出一个观测点属于哪一类。

























版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204040.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:09
下一篇 2026年3月19日 下午9:09


相关推荐

  • 【面试必备】这道MySQL面试题难住了90%的程序员。。。「建议收藏」

    【面试必备】这道MySQL面试题难住了90%的程序员。。。

    2022年2月11日
    48
  • 稳定性测试_pdp职业性格测试结果分析

    稳定性测试_pdp职业性格测试结果分析最近工作过程中没少开会,产品总监与研发总监就产品可用性和稳定性开始了一轮大战。于是我搜集网络资源,罗列一些稳定性测试,只为分享。1关于软件稳定性测试的思路如何测试软件的稳定性其实是很难的,按照常规思路,只有长期的用户场景测试才能一定程度上保证软件的稳定性是可靠的,但并不能百分之百确定软件就是稳定的。软件测试本身就是由局限和尽头的,无穷的测试只能带来高成本的投入和无限期的计…

    2025年10月16日
    3
  • 使用request对象进行数据传递「建议收藏」

    使用request对象进行数据传递「建议收藏」在进行请求转发时,需要把一些数据传递到转发后的页面进行处理,需要使用request对象的setAttribute方法将数据保存到request范围内的变量中使用:request对象可以视为一个域,可以应用setAttribute()方法向域范围内存放数据request对象的setAttribute()方法的格式:request.setAttribute(Stringname,Objectobject);参数说明name:变量名,为String类型,object:用于指定需要在request

    2022年5月23日
    32
  • python数据可视化_python中datetime用法

    python数据可视化_python中datetime用法xiao.77如何通过Python写入date数据了?写入还是很简单的。importxlwt3importdatetimeasdtworkbook=xlwt.Workbook()worksheet=workbook.add_sheet(‘sheet1’)worksheet.write(0,0,dt.date.today())workbook.save(‘test.xls’)查…

    2022年10月6日
    5
  • axios配置请求头content-type「建议收藏」

    axios配置请求头content-type「建议收藏」axios是Ajax的一个插件,axios虽然是一个插件,但是我们不需要通过Vue.use(axios)来使用,下载完成后,只需在项目中引入即可。(一般我们放在了请求接口的公共文件中引用)npminstallaxios-Saxios发送post请求时默认是直接把json放到请求体中提交到后端的,axios默认的请求头content-type类型是’application/json;charset=utf-8’.content-type的三种常见数据格式://1默认.

    2022年8月24日
    9
  • 二叉树的非递归前序、中序、后序遍历算法详解及代码实现(C语言)

    二叉树的非递归前序、中序、后序遍历算法详解及代码实现(C语言)转载请注明出处 https blog csdn net Benja K article details 二叉树的非递归前 中 后序遍历算法详解及代码实现 C 语言 1 前序遍历和中序遍历非递归算法思路前序和中序非递归遍历的 C 代码 2 后序遍历非递归算法思路后序非递归遍历的 C 代码 1 前序遍历和中序遍历非递归算法思路遍历过程 如图所示 图 1 前

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号