用EM算法估计GMM参数的实现

news2024/11/15 9:40:14

EM算法,即期望最大化算法(Expectation Maximization Algorithm),是一种在统计学中用于估计概率模型参数的类似极大似然估计的迭代算法,特别适用于模型中包含隐变量或者数据由多个混合分布组成的情况。隐变量(Latent Variable)是指在统计模型或机器学习模型中,那些不直接观测到但能够通过模型间接推断或预测的变量,隐变量通常用于描述数据中的潜在结构或模式,它们可以帮助我们更好地理解数据生成过程或进行更准确的预测。EM算法通过迭代的方式交替执行两个步骤:期望(E)步骤和最大化(M)步骤,直到收敛到最优参数值。

具体步骤如下:

  1. E步骤(Expectation step):计算隐变量的期望值,给定当前模型参数和观测数据,计算隐变量的条件概率,又称后验概率(即给定数据点,它属于每个分布的概率)。

  2. M步骤(Maximization step):更新模型参数,利用E步骤得到的隐变量的期望值来最大化似然函数,从而得到新的参数估计。

在Python中,可以使用相应的库函数轻松实现EM算法,例如使sklearn.mixture.GaussianMixture类来拟合高斯混合模型。此外,EM算法也可以通过编写相应的迭代代码来手动实现。

接下来将演示EM算法(期望最大化算法)一个典型的应用场景,可用于高斯混合模型(Gaussian Mixture Model, GMM)的参数估计。

一:问题背景

高斯混合模型(GMM)

  1. 模型描述:GMM是一种概率模型,用于表示由多个高斯分布组成的混合分布。在GMM中,每个数据点都是由某个未知的高斯分布生成的,而这个分布是所有混合分布中的一个。
  2. 参数估计问题:在GMM中,我们需要估计的参数包括每个高斯分布的均值、方差以及每个分布的混合系数。由于我们不知道每个数据点来自哪个分布,因此这是一个不完全数据问题。

GMM是聚类分析中常用的方法之一,它可以发现数据中的自然分组,即使这些分组不是明显的或有重叠。

EM算法在GMM中的应用

  1. E步(期望步):计算每个数据点由每个高斯分布生成的后验概率。
  2. M步(最大化步):根据E步计算的后验概率,更新每个高斯分布的参数(均值、方差和混合系数)。

通过迭代进行E步和M步,EM算法能够逐步改进参数估计,直到收敛到局部最优解。

接下来将使用Python来演示一个简单的GMM参数估计的EM算法示例。在这个示例中将生成一些模拟的混合高斯分布的数据,并使用EM算法来估计这些分布的参数。

二:用EM算法估计GMM参数

Step1:生成模拟数据

import numpy as np
import matplotlib.pyplot as plt

# 设置随机种子以确保结果可重复
np.random.seed(42)

# 生成模拟数据
# 假设有两个高斯分布混合
mean1 = [0, 0]
cov1 = [[1, 0.5], [0.5, 1]]
data1 = np.random.multivariate_normal(mean1, cov1, 100)

mean2 = [5, 5]
cov2 = [[1, -0.5], [-0.5, 1]]
data2 = np.random.multivariate_normal(mean2, cov2, 100)

data = np.vstack((data1, data2))

# 绘制数据点
plt.scatter(data[:, 0], data[:, 1], alpha=0.6)
plt.title("模拟的混合高斯分布数据")
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.show()

这段代码的目的是生成并可视化一个由两个高斯分布混合组成的模拟数据集。下面是对代码的详细解释:

  1. 导入必要的库

    • numpy:用于数学运算和数据处理。
    • matplotlib.pyplot:用于数据可视化。
  2. 设置随机种子

    np.random.seed(42):确保每次运行代码时生成的随机数都是相同的,这对于结果的可重复性很重要。
  3. 生成模拟数据

    • mean1 和 cov1:定义第一个高斯分布的均值和协方差矩阵。
    • data1:使用 numpy.random.multivariate_normal 函数生成第一个高斯分布的数据点。
    • mean2 和 cov2:定义第二个高斯分布的均值和协方差矩阵。
    • data2:生成第二个高斯分布的数据点。
    • data:将两个分布的数据垂直堆叠起来,形成一个单一的数据集。
  4. 数据可视化

    • plt.scatter(data[:, 0], data[:, 1], alpha=0.6):使用散点图绘制数据点,其中 alpha=0.6 设置了点的透明度。
    • plt.title("模拟的混合高斯分布数据"):设置图表的标题。
    • plt.xlabel("X轴") 和 plt.ylabel("Y轴"):设置X轴和Y轴的标签。
    • plt.show():显示图表。

这段代码展示了如何生成具有特定统计特性的数据集,并且通过可视化来直观地观察这些特性。

得到模拟的混合高斯分布数据如下:

Step2:EM算法估计GMM参数

现在我们已经生成了模拟数据,接下来将实现EM算法来估计这些数据的GMM参数。EM算法的主要步骤如下:

  1. 初始化参数:随机选择初始的均值、方差和混合系数。
  2. E步:计算每个数据点由每个高斯分布生成的后验概率。
  3. M步:根据E步计算的后验概率,更新每个高斯分布的参数。
  4. 重复E步和M步:直到参数估计收敛。

我们将重复这些步骤,直到参数的变化小于某个阈值,这通常意味着算法已经收敛。

让我们开始实现EM算法。

from sklearn.mixture import GaussianMixture

# 使用EM算法估计GMM参数
gmm = GaussianMixture(n_components=2, random_state=42)
gmm.fit(data)

# 提取估计的参数
means = gmm.means_
covariances = gmm.covariances_
weights = gmm.weights_

means, covariances, weights

通过EM算法,我们成功估计了模拟数据的GMM参数。估计得到的参数如下:

  1. 均值

    • 第一个高斯分布的均值:[0.083,0.117]
    • 第二个高斯分布的均值:[4.911,5.133]
  2. 协方差

    • 第一个高斯分布的协方差:[0.8150.2980.2980.768]
    • 第二个高斯分布的协方差:[1.088−0.586−0.5860.949]
  3. 混合系数

    • 第一个高斯分布的权重:0.50
    • 第二个高斯分布的权重:0.50

这些参数接近于我们生成模拟数据时使用的真实参数,表明EM算法能够有效地估计GMM的参数。

如果想要了解更多相关金融工程的内容,可以关注之前的内容。

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

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

相关文章

模型 RULER情绪管理

系列文章 分享 模型,了解更多👉 模型_思维模型目录。识别情绪,智慧表达,和谐生活。 1 RULER情绪管理模型的应用 1.1 RULER情绪管理模型在小学教育中的实践 背景: 在一所注重学生全面发展的小学中,教师们发…

【kubernetes】Service 介绍和应用

一,Service介绍 四层代理是基于传输层(第四层)工作的代理,主要在传输层(如TCP、UDP协议)上转发和管理数据流 七层代理是基于应用层(第七层)工作的代理,能够对应用层协议…

nginx启动报错:worker_connections exceed open file resource limit: 1024

一、问题描述 某次,nginx重启报错: nginx: [warn] 4096 worker_connections exceed open file resource limit: 1024;如下所示: 二、处理 1)原因:nginx默认最大的并发数为1024,如果你设置work…

IDEA提示:java: 常量字符串过长

大家好,我是瑶山,今天聊聊java执行字符串过长的问题 起因 main方法测试一个上传人脸的请求,人脸图片使用Base64格式字符串,执行失败,提示:java: 常量字符串过长 在Java中,当你在main方法中直接…

Java | Leetcode Java题解之第390题消除游戏

题目: 题解: class Solution {public int lastRemaining(int n) {int a1 1;int k 0, cnt n, step 1;while (cnt > 1) {if (k % 2 0) { // 正向a1 a1 step;} else { // 反向a1 (cnt % 2 0) ? a1 : a1 step;}k;cnt cnt >> 1;step s…

三大CSS特效与灵感宝藏网站:加速前端开发,提升网站视觉盛宴

在日常的Web开发旅程中,前端程序员扮演着至关重要的角色,他们不仅是页面结构的搭建者,更是用户体验的塑造者。随着技术的不断进步,用户对于网页的视觉效果和交互体验要求越来越高,这就要求前端开发者必须掌握更多高级技…

Session钝化与活化:深度解析

Session钝化与活化:深度解析 1、钝化(Passivation)2、活化(Activation)3、序列化要求4、总结 💖The Begin💖点点关注,收藏不迷路💖 在Web开发中,Session扮演着…

自搭靶机实现SSH爆破复现记录

编写脚本实现ssh爆破。可使用paramiko、pexpect、pxssh等Python模块进行编写。但在ssh服务端将配置加密方式为非常用加密方式3des-cbc,端口为9981端口。 创建 了一个新的Kali虚拟机作为靶机,使用原本的Kali作为攻击机。 设置一个用户为target1234&#…

数学建模强化宝典(5)整数规划

前言 整数规划是数学规划中的一种特殊类型,它要求决策变量的取值必须是整数。这种规划问题在实际应用中非常普遍,因为很多决策问题(如生产数量、人员分配、车辆调度等)的解都必须是整数。整数规划可以分为几类,主要包括…

07:【江科大stm32】:编码器通过定时器测速

编码器通过定时器测速 编码器的转动方向不同,则输出波形的相位也不同。如下图所示: 编码器标准库的编程接口: ①Encoder.c文件的代码如下: #include "stm32f10x.h" // Device header//使用PA6&…

黑马-Cloud21版-实用篇05:分布式搜索引擎02:DSL查询文档、搜索结果处理、RestClient查询文档、黑马旅游案例

分布式搜索引擎02 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…

[Linux]:基本指令(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 与Windows环境不同,我们在linux环境下需要通过指令进行各操作&…

PHP8、ThinkPHP8框架中间的应用教程详解

前言 虽然PHP的落幕的话题一直不绝,但是实际在WEB端项目中PHP占有率达到了70%以上,一直在WEB一枝独秀,它以快速、高效的开发闻名,出圈了几十年,等待只是下一次的涅槃。而经过PHP8、PHP9的演变发展,PHP逐渐…

微软最新轻量级、多模态Phi-3.5-vision-instruct模型部署

Phi-3.5-vision-instruct是微软最新发布的 Phi-3.5 系列中的一个AI模型,专注于多模态任务处理,尤其是视觉推理方面的能力。 Phi-3.5-vision-instruct模型具备广泛的图像理解、光学字符识别(OCR)、图表和表格解析、多图像或视频剪…

【STM32】通用定时器TIM(输入捕获)

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 前言 输入捕获简介 输入捕获配置 初始化IO口 输入捕获初始化 选择触发源及从模式 测量频率方法 输入捕获代码 IC.h IC.c 输入捕获测占空比 前言 建议先阅读这篇博客&#xf…

Open3D mesh 均值滤波

Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述 均值滤波(Mean Filtering)是一种基本的网格平滑技术,通过将每个顶点的位置替换为其邻域…

[ABC369C] Count Arithmetic Subarrays

首先看了下题意 大致题意就是让你在长度为的序列找出所有的等差数列。 -----------------------------------------------------------------------------------------我是分界线 我的思路了,就是先从2开始计算等差数列,从3开始判断,如果是…

C#从入门到精通(21)—Mutex互斥锁在多线程、多进程下的使用

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!人工智能学习网站 前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任…

C语言调用子函数时入/出栈(保护/恢复现场)全过程分析:以Cortex-M3为例

0 参考资料&工具 Cortex M3权威指南(中文).pdf keil5(用于仿真查看寄存器、栈变化)1 C语言调用子函数时出入/出栈(保护/恢复现场)全过程分析 使用C语言调用子函数是如何保护/恢复现场的呢?本文以Cortex-M3为例&a…

Zynq之IIC使用示例

前言 明确设计思路,精准定位问题,对于我们后期理解迭代工程有很大的帮助。 这就是我们常说的40%设计,20%编写和剩下的40%时间进行调试优化。 今天为大家带来的是Zynq-PS端的IIC使用demo,通过驱动外设DS1337来强化对IIC的使用方…