机器学习:详细推导高斯混合聚类(GMM)原理(附Python实现)

news2024/11/13 14:57:40

目录

  • 0 写在前面
  • 1 高斯概率密度
  • 2 混合高斯分布
  • 3 GMM算法
    • 3.1 定义
    • 3.2 参数估计
  • 4 Python实现
    • 4.1 算法流程
    • 4.2 E步
    • 4.3 M步
    • 4.4 可视化

0 写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编写、测试与文章配套的各个经典算法,不依赖于现有库,可以大大加深对算法的理解。

🚀详情:机器学习强基计划(附几十种经典模型源码)


1 高斯概率密度

高斯分布又叫正态分布,是一个在理科、工科、文科等多个领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力,具有:

  • 集中性:正态曲线的高峰位于正中央
  • 对称性:正态曲线以均值为中心,左右对称
  • 均匀性:正态曲线从均值处开始,分别向左右两侧逐渐均匀下降

高斯分布的表达式是

f ( x ) = 1 2 π σ exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) f\left( x \right) =\frac{1}{\sqrt{2\pi}\sigma}\exp \left( -\frac{\left( x-\mu \right) ^2}{2\sigma ^2} \right) f(x)=2π σ1exp(2σ2(xμ)2)

其中 μ \mu μ是均值, σ \sigma σ是标准差

在这里插入图片描述

2 混合高斯分布

混合高斯模型(Gaussian Mixture Model)是通过一定的权重将多个单高斯分布加权而成的混合概率模型,使模型容量更大,产生更复杂的采样或拟合更复杂的分布。

混合高斯分布的表达式很容易理解:

p M ( x ) = ∑ j = 1 k π j P ( x ∣ μ j , Σ j ) p_{\mathcal{M}}\left( \boldsymbol{x} \right) =\sum_{j=1}^k{\pi _jP\left( \boldsymbol{x}|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right)} pM(x)=j=1kπjP(xμj,Σj)

其中 ∑ j = 1 k π j = 1 \sum_{j=1}^k{\pi _j}=1 j=1kπj=1,将第一节的三个高斯分布以一定权重加权得到下图所示的混合高斯分布

在这里插入图片描述

3 GMM算法

3.1 定义

高斯混合聚类基于极大似然法,采用一组原型分布来刻画数据聚合结构。在基于原型向量的原型聚类中,与原型向量最接近的样本被划分为簇;在GMM中,则将最有可能由原型分布产生的样本划分为簇

样本 x \boldsymbol{x} x符合上述的混合高斯分布

p M ( x ) = ∑ j = 1 k P ( x , z ∣ μ j , Σ j ) = ∑ j = 1 k P ( z ∣ μ j , Σ j ) P ( x ∣ μ j , Σ j ) p_{\mathcal{M}}\left( \boldsymbol{x} \right) =\sum_{j=1}^k{P\left( \boldsymbol{x},z|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right)}=\sum_{j=1}^k{P\left( z|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right) P\left( \boldsymbol{x}|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right)} pM(x)=j=1kP(x,zμj,Σj)=j=1kP(zμj,Σj)P(xμj,Σj)

其中 P ( x ∣ μ j , Σ j ) P\left( \boldsymbol{x}|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right) P(xμj,Σj)为高斯分布

P ( x ∣ μ j , Σ j ) = 1 ( 2 π ) d / 2 ∣ Σ j ∣ 1 / 2 exp ⁡ ( − 1 2 ( x − μ j ) T Σ j − 1 ( x − μ j ) ) P\left( \boldsymbol{x}|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right) =\frac{1}{\left( 2\pi \right) ^{{{d}/{2}}}\left| \boldsymbol{\varSigma }_j \right|^{{{1}/{2}}}}\exp \left( -\frac{1}{2}\left( \boldsymbol{x}-\boldsymbol{\mu }_j \right) ^T\boldsymbol{\varSigma }_{j}^{-1}\left( \boldsymbol{x}-\boldsymbol{\mu }_j \right) \right) P(xμj,Σj)=(2π)d/2Σj1/21exp(21(xμj)TΣj1(xμj))

隐变量 z i z_i zi为样本 x \boldsymbol{x} x所属的簇标记,也是我们要学习的参数。 P ( x ∣ μ j , Σ j ) P\left( \boldsymbol{x}|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right) P(xμj,Σj) P ( z ∣ μ j , Σ j ) P\left( z|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right) P(zμj,Σj)独立,因为隐式地为 x \boldsymbol{x} x赋予标记不会影响 x \boldsymbol{x} x由某个高斯分布分量 N j ( μ j , Σ j ) N_j\left( \boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right) Nj(μj,Σj)产生的概率。进一步,定义由 N j ( μ j , Σ j ) N_j\left( \boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right) Nj(μj,Σj)产生样本的簇标记就为 j j j,即 P ( z ∣ μ j , Σ j ) = P ( z = j ) P\left( z|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right) =P\left( z=j \right) P(zμj,Σj)=P(z=j),记为 α \alpha α。混合高斯分布简化为

p M ( x ) = ∑ j = 1 k α j P ( x ∣ μ j , Σ j ) p_{\mathcal{M}}\left( \boldsymbol{x} \right) =\sum_{j=1}^k{\alpha _jP\left( \boldsymbol{x}|\boldsymbol{\mu }_j,\boldsymbol{\varSigma }_j \right)} pM(x)=j=1kαjP(xμj,Σj)

其中 ∑ j = 1 k α j = 1 \sum\nolimits_{j=1}^k{\alpha _j}=1 j=1kαj=1

3.2 参数估计

对于模型参数待估计且隐变量分布未知的情形,采用EM算法迭代求解。这部分的推导请看机器学习强基计划6-4:详细推导期望最大化EM算法及收敛性分析(附实例),通过EM算法可以得到

μ j = ∑ i = 1 m γ i j x i ∑ i = 1 m γ i j {\boldsymbol{\mu }_j=\frac{\sum\nolimits_{i=1}^m{\gamma _{ij}\boldsymbol{x}_i}}{\sum\nolimits_{i=1}^m{\gamma _{ij}}}} μj=i=1mγiji=1mγijxi

Σ j = ∑ i = 1 m γ i j ( x i − μ j ) ( x i − μ j ) T ∑ i = 1 m γ i j {\boldsymbol{\varSigma }_j=\frac{\sum\nolimits_{i=1}^m{\begin{array}{c} \gamma _{ij}\left( \boldsymbol{x}_i-\boldsymbol{\mu }_j \right)\\\end{array}\left( \boldsymbol{x}_i-\boldsymbol{\mu }_j \right) ^T}}{\sum\nolimits_{i=1}^m{\begin{array}{c} \gamma _{ij}\\\end{array}}}} Σj=i=1mγiji=1mγij(xiμj)(xiμj)T

其中 γ i j ( j = 1 , 2 , ⋯   , k ) \gamma _{ij}\left( j=1,2,\cdots ,k \right) γij(j=1,2,,k)是经过E步计算得到的 Q ( z i ) Q\left( \boldsymbol{z}_i \right) Q(zi)

对于 α \alpha α,由于其需要在满足 ∑ j = 1 k α j = 1 \sum\nolimits_{j=1}^k{\alpha _j}=1 j=1kαj=1的前提下最大化似然,因此引入拉格朗日形式

L L ( θ , λ ) = L ( θ ) + λ ( ∑ j = 1 k α j − 1 ) LL\left( \boldsymbol{\theta },\lambda \right) =L\left( \boldsymbol{\theta } \right) +\lambda \left( \sum_{j=1}^k{\alpha _j-1} \right) LL(θ,λ)=L(θ)+λ(j=1kαj1)

其中 λ \lambda λ为拉格朗日算子。令 ∂ L L ( θ , λ ) / ∂ α j = 0 {{\partial LL\left( \boldsymbol{\theta },\lambda \right)}/{\partial \alpha _j}}=0 LL(θ,λ)/αj=0,则

∂ L L ( θ , λ ) ∂ α j = ∂ L ( θ ) ∂ α j + λ = ∑ i = 1 m γ i j α j + λ = 0 \frac{\partial LL\left( \boldsymbol{\theta },\lambda \right)}{\partial \alpha _j}=\frac{\partial L\left( \boldsymbol{\theta } \right)}{\partial \alpha _j}+\lambda =\sum_{i=1}^m{\frac{\gamma _{ij}}{\alpha _j}}+\lambda =0 αjLL(θ,λ)=αjL(θ)+λ=i=1mαjγij+λ=0

即得 α j = − ∑ i = 1 m γ i j / λ \alpha _j=-\sum\nolimits_{i=1}^m{{{\gamma _{ij}}/{\lambda}}} αj=i=1mγij/λ。注意到等式 ∑ i = 1 m γ i j / α j + λ = 0 \sum\nolimits_{i=1}^m{{{\gamma _{ij}}/{\alpha _j}}}+\lambda =0 i=1mγij/αj+λ=0两边对 k k k个高斯分量求和可得

∑ j = 1 k ∑ i = 1 m γ i j + λ ∑ j = 1 k α j = 0 ⇒ ∑ i = 1 m ∑ j = 1 k γ i j + λ = 0 ⇒ λ = − m \sum_{j=1}^k{\sum_{i=1}^m{\gamma _{ij}}}+\lambda \sum_{j=1}^k{\alpha _j}=0\Rightarrow \sum_{i=1}^m{\sum_{j=1}^k{\gamma _{ij}}}+\lambda =0\Rightarrow \lambda =-m j=1ki=1mγij+λj=1kαj=0i=1mj=1kγij+λ=0λ=m

所以

α j = − 1 m ∑ i = 1 m γ i j { \alpha _j=-\frac{1}{m}\sum_{i=1}^m{\gamma _{ij}}} αj=m1i=1mγij

4 Python实现

4.1 算法流程

在这里插入图片描述

4.2 E步

gamma = []  # 后验概率 i x j
for i in range(self.m):
    gammaSum = 0
    for j in range(self.k):
        gammaSum = gammaSum + self.alpha[j] * self.__gauss(self.dataSet[i], self.miu[j], self.sigma[j])
    for j in range(self.k):
        gamma.append(self.alpha[j] * self.__gauss(self.dataSet[i], self.miu[j], self.sigma[j]) / gammaSum)

4.3 M步

  • 更新均值向量
    for j in range(self.k):
       miuTemp = np.zeros_like(self.miu[0])
       for i in range(self.m):
           miuTemp = miuTemp + gamma[i * self.k + j] * self.dataSet[i]
           gammaTemp = gammaTemp + gamma[i * self.k + j]
       gammaTempList.append(gammaTemp)
       self.miu[j] = miuTemp / gammaTemp
       gammaTemp = 0
    
  • 更新协方差矩阵
    for j in range(self.k):
    sigmaTemp = np.zeros_like(self.sigma[0])
    for i in range(self.m):
        sigmaTemp = sigmaTemp + gamma[i * self.k + j] * np.array(self.dataSet[i] - self.miu[j]).reshape([self.dim, 1]) * \
                    np.array(self.dataSet[i] - self.miu[j]).reshape([1, self.dim]) 
    self.sigma[j] = sigmaTemp / gammaTempList[j]
    
  • 更新混合系数
    for j in range(self.k):
        self.alpha[j] = gammaTempList[j] / self.m
    

和算法流程一一对应,可对照学习加深理解

4.4 可视化

在这里插入图片描述

本文完整工程代码联系下方博主名片获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用 NEON 实现高效的 FIR 滤波器

系列文章目录 数字信号处理中的 SIMDNeon intrinsics 简明教程 文章目录系列文章目录写在前面前言FIR 滤波器优化方案何时应该使用时域的滤波器?如何加快FIR滤波器的实现速度?初步假设有限长度信号反转的滤波器系数实际的卷积公式卷积过程可视化线性卷积…

第二期 微信云开发之位置信息获取(wx.getLocation)

很多小伙伴在开发微信小程序的时候,需要获取当前用户位置信息时,都会遇到该如何获取位置详细信息的问题,以下是我的处理方法。 首先,我在生活智打卡小程序使用的是微信小程序自带的获取用户的位置信息的接口(wx.getLoc…

基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+论文)

分类号:TP315 U D C:D10621-408-(2007)5978-0 密 级:公 开 编 号:2003031227 成都信息工程学院 学位论文 基于JSP技术的猎头公司管理软件的设计和实现 ——内部事务部分 基于JSP技术的猎头公司管理软件的设计和实现 ——内…

世界杯太精彩了,带大家用Python做个足球游戏,边玩游戏边看比赛

文章目录 Python零基础快速制作足球游戏(附源代码) 前言 一、Python环境说明 二、游戏程序说明 1、游戏开始界面 2、人物移动规则说明,可支持两位玩家 3、足球规则 4、主方法调取 三、游戏运行效果与比赛结果 1、游戏开始界面 2、…

桥接设计模式

一、桥接模式 1、定义 桥接模式(Bridge Pattern)又称作桥梁模式,指将抽象部分与具体实现部分分离,使它们都可以独立地变化,属于结构型设计模式。 桥接模式的主要目的是通过组合的方式建立两个类之间的联系&#xff0c…

java计算机毕业设计ssm社区养老服务管理系统iq0w7(附源码、数据库)

java计算机毕业设计ssm社区养老服务管理系统iq0w7(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

海口市美兰区图书馆建筑结构设计(计算书+任务书+建筑结构施工组织设计cad图纸)

【目录】 1目录……………………………………………………………………………………………………….1 2前言……………………………………………………………………………………………………3 3 摘要……………………………………………………………….…………………………1 结…

Java项目:SSM出租车管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 超级管理员角色包含以下功能: 超级管理员管理,公告管理,系统管理员管理,司机管理,车辆管理,维修保养管理,运营里程记录等功能。 普通…

12.4泛型 map set

目录 一,泛型 1 什么是泛型 2 引出泛型 2.1语法 3 泛型类的使用 3.1 语法 3.2 示例 3.3 类型推导(Type Inference) 4.裸类型(Raw Type) 5 泛型如何编译的 5.2 为什么不能实例化泛型类型数组 6 泛型的上界 6.1 语法 6.3 复杂示例 7 泛型方法 7.1 定义语法 二.通…

【数据结构】二分搜索树

集合java.util包下的常用子类,集合无非就是各种数据结构的应用。集合存在的目的就是为了将数据高校进行读写,无论哪种具体的集合无外乎CURD。 Collection->单个元素保存的父接口。 List->可以保存重复的单个元素。 Set->保存单个不重复元素。…

python在centos7.x下建立虚拟环境

(327条消息) python在centos下安装以及配置_雨师的博客-CSDN博客 https://blog.csdn.net/wtt234/article/details/128172281 python离线环境下安装第三方模块的方法: https://blog.csdn.net/wtt234/article/details/128162292 上篇已经把python在centos下的安装以及…

红蓝对抗--sliver 搭建

使用sliver的优点: 1 支持macos、win、linux上线 2 支持丰富的插件加载扩展,功能选择多,CS已经很普遍了,可以尝试sliver做C2 sliver相关构成: Implant:生成植入的木马 sliver-client :C2的控制端 Sliver Server:C2的控制端,客户端通过gRPC接口与server交互 架构: […

【 java 集合】Collection 接口中的常用方法

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

LeetCode刷题复盘笔记—一文搞懂纯完全背包问题(动态规划系列第十一篇)

今日主要总结一下动态规划背包问题的基础——纯完全背包问题 在Leetcode题库中主要都是0-1背包和完全背包的应用问题,所以主要掌握这两个背包问题 题目:纯完全背包问题 题目描述: 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是w…

List——顺序表与链表(二)

文章目录前言一、链表概念及结构二、LinkedList与链表1.什么是LinkedList2.LinkedList的常用方法3.链表的遍历三.实现自己的LinkedList四.ArrayList和LinkedList的区别与优缺点总结前言 上一篇文章中,介绍了List接口以及ArrayList的使用,并且进行了简单…

ByteTrack多目标追踪论文阅读

paper:ByteTrack: Multi-Object Tracking by Associating Every Detection Box code:ByteTrack 一.摘要 多目标追踪的目的是识别视频中物体或对象的位置和身份,也就是说,不同于目标检测的是,追踪问题可以分为两个任务:1&#x…

(附源码)springboot平衡膳食小程序 毕业设计 250859

基于springboot平衡膳食小程序 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,平衡膳食小程序被用户普遍使…

物联网设备WIFI模块实现

问题 如何在设备上进行 Wifi 编程? LwIp (Light Weight IP) 简介 LwIp 是轻量化的 TCP/IP,是一个小型开源的 TCP/IP 协议栈 LwIp 的设计目标是用较少的资源实现较完整的 TCP/IP 协议栈 LwIp 能在操作系统中运行,也能在无操作系统的情况下…

Java—异常体系

文章目录异常和错误java异常的分类:非运行时异常运行时异常受检异常(非运行时异常)如何处理?1、try catch finally为什么要用try catch finally2、throwsThrow和Throws的区别JVM是如何处理异常的try-catch-finally中哪个部分可以省…

项目管理逻辑:项目经理如何掌控项目生命周期, 才能避免身心俱疲?

目录 1.项目生命周期 2.预测型项目周期 3.迭代型项目周期 3.1.初始阶段 3.2.精化阶段 3.3.构建阶段 3.4.交付阶段 4.增量型生命周期 5.敏捷开发 5.根据具体项目使用合理的开发方式 1.项目生命周期 2.预测型项目周期 预测型项目周期就是软件开发领域的瀑布流模型&…