什么是期望最大化算法?

一、期望最大化算法

        期望最大化(EM)算法是一种在统计学和机器学习中广泛使用的迭代方法,它特别适用于含有隐变量的概率模型参数估计问题。在统计学和机器学习中,有很多不同的模型,例如高斯混合模型(GMM)、隐马尔可夫模型(HMM)等,都可以用EM算法来估计这些模型中的参数。EM算法的主要思想是通过两个步骤的交替执行来找到模型参数的估计值:期望(E)步骤和最大化(M)步骤。此外,EM算法的收敛性也意味着它可以在多次迭代后得到稳定的参数估计,这对于模型的预测和分析非常重要。

二、期望最大化算法原理

1、E步骤(Expectation step)

        在E步骤中,我们计算隐变量的条件期望给定观测数据和当前参数估计。假设我们有一个数据集X = \left \{ x_{1},x_{2},...,x_{N} \right \},隐变量Z = \left \{ z_{1},z_{2},...,z_{N} \right \}和参数\theta,则E步骤计算的是:

Q(z_{i}|x_{i},\theta) = P(z_{i}|x_{i},\theta)

        其中,Q(z_{i}|x_{i},\theta)是隐变量z_{i}在观测数据x_{i}和当前参数\theta下的条件概率。

2、M步骤(Maximization step):

        在M步骤中,我们利用E步骤计算出的隐变量的分布来更新参数\theta的估计,以最大化似然函数。M步骤的计算公式为:

\theta^{(new)} = argmax_{\theta}\sum_{i=1}^{N}\sum_{z_{i}}Q(z_{i}|x_{i},\theta^{(old)})logp(x_{i},z_{i}|\theta)

        其中,\theta^{(new)}是更新后的参数估计,\theta^{(old)}是上一步的参数估计,N是数据点的数量,求和是对所有数据点和所有可能的隐变量值进行的。

三、EM算法应用

        假设我们有一个高斯混合模型GMM,其中有K个高斯分布,参数为\phi = \left \{ \pi _{k},\mu _{k},\sigma _{k}^{2} \right \},其中\pi_{k}是第k个高斯分布的权重,\mu_{k}是均值,\sigma _{k}^{2}是方差,则计算EM有:

1、E步骤

        计算每个数据点属于每个高斯分布的responsibility(也称为 posterior probability):

Q(z_{i}|x_{i},\phi ) = \frac{\pi_{k}N(x_{i}|\mu_{k},\sigma_{k}^{2})}{\sum_{j=1}^{K}\pi_{j}N(x_{i}|\mu_{j},\sigma_{j}^{2})}

        这里,N(x|\mu,\sigma^{2})是多元正态分布的概率密度函数

2、M步骤

        更新每个高斯分布的参数:

\pi_{k} = \frac{1}{N}\sum_{i=1}^{N}Q(z_{i}=k|x_{i},\phi)

\mu_{k} = \frac{\sum_{i=1}^{N}Q(z_{i}=k|x_{i},\phi)x_{i}}{\sum_{i=1}^{N}Q(z_{i}=k|x_{i},\phi)}

\sigma_{k}^{2} = \frac{\sum_{i=1}^{N}Q(z_{i}=k|x_{i},\phi)(x_{i}-\mu_{k})^{2}}{\sum_{i=1}^{N}Q(z_{i}=k|x_{i},\phi)}

        其中,Q(z_{i}=k|x_{i},\phi)是数据点x_{i}属于第k个高斯分布的后验概率。N是数据点的数量,求和对所有数据点进行,E步骤和M步骤交替进行,知道参数\phi收敛。参数更新公式中,分子和分母有相同的部分,但不能简单约去,因为分母中的部分确保了每个数据点在计算新的均值时,其贡献是按照它属于该高斯分布的概率加权的。

四、python实现EM算法

        这里,首先生成两个高斯分布的数据,然后定义一个高斯函数来计算给定均值和标准差的数据的概率密度。接下来,定义E步骤和M步骤的函数。最后,运行EM算法迭代100次。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal# 生成示例数据
np.random.seed(42)
X = np.vstack([np.random.multivariate_normal([0, 0], np.eye(2), 100),np.random.multivariate_normal([5, 5], np.eye(2), 100)])# 定义高斯函数
def gaussian(X, mean, cov):return multivariate_normal.pdf(X, mean, cov)# E步骤
def e_step(X, weights, means, covariances):n, d = X.shapek = len(weights)responsibilities = np.zeros((n, k))for i in range(k):responsibilities[:, i] = weights[i] * gaussian(X, means[i], covariances[i])responsibilities /= responsibilities.sum(axis=1, keepdims=True)return responsibilities# M步骤
def m_step(X, responsibilities):n, d = X.shapek = responsibilities.shape[1]weights = responsibilities.sum(axis=0) / nmeans = np.dot(responsibilities.T, X) / responsibilities.sum(axis=0)[:, np.newaxis]covariances = np.zeros((k, d, d))for i in range(k):diff = X - means[i]covariances[i] = np.dot(responsibilities[:, i] * diff.T, diff) / responsibilities[:, i].sum()return weights, means, covariances# 初始化参数
def initialize_parameters(X, k):n, d = X.shapeweights = np.ones(k) / kmeans = X[np.random.choice(n, k, False)]covariances = np.array([np.eye(d)] * k)return weights, means, covariances# EM算法
def em_algorithm(X, k, max_iter=100, tol=1e-6):weights, means, covariances = initialize_parameters(X, k)log_likelihoods = []for i in range(max_iter):responsibilities = e_step(X, weights, means, covariances)weights, means, covariances = m_step(X, responsibilities)log_likelihoods.append(log_likelihood(X, weights, means, covariances))if i > 0 and np.abs(log_likelihoods[-1] - log_likelihoods[-2]) < tol:breakreturn weights, means, covariances, log_likelihoods, responsibilities# 计算对数似然
def log_likelihood(X, weights, means, covariances):n, d = X.shapek = len(weights)log_likelihood = 0for i in range(k):log_likelihood += weights[i] * gaussian(X, means[i], covariances[i])return np.log(log_likelihood).sum()# 绘制高斯分布的等高线
def draw_ellipse(mean, cov, ax, label, alpha=1.0):from matplotlib.patches import Ellipsev, w = np.linalg.eigh(cov)v = 2.0 * np.sqrt(2.0) * np.sqrt(v)u = w[0] / np.linalg.norm(w[0])angle = np.arctan(u[1] / u[0])angle = 180.0 * angle / np.piell = Ellipse(mean, v[0], v[1], 180.0 + angle, edgecolor='red', lw=2, facecolor='none', alpha=alpha, label=label)ax.add_patch(ell)# 运行EM算法
k = 2
weights, means, covariances, log_likelihoods, responsibilities = em_algorithm(X, k)# 可视化最终结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], s=10, label='Data points')
ax = plt.gca()
for j in range(k):draw_ellipse(means[j], covariances[j], ax, label=f'Gaussian {j+1}', alpha=weights[j])
plt.title('Final Gaussian Mixture Model')
plt.legend()
plt.show()# 打印结果
print("权重:", weights)
print("均值:", means)
print("协方差矩阵:", covariances)# 打印对数似然
print("对数似然:", log_likelihoods[-1])# 计算AIC和BIC
n, d = X.shape
num_params = k * (d + d * (d + 1) / 2) + k - 1
aic = 2 * num_params - 2 * log_likelihoods[-1]
bic = np.log(n) * num_params - 2 * log_likelihoods[-1]
print("AIC:", aic)
print("BIC:", bic)

        其中,aic和bic计算模型的AIC和BIC值,AIC和BIC值越小,表示模型越好。理想情况下,高斯分布的等高线应该很好地覆盖数据点的分布区域,可视化结果如下。

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

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

相关文章

LeetCode讲解篇之3. 无重复字符的最长子串

文章目录 题目描述题解思路代码实现 题目描述 题解思路 因为我们需要求无重复字符的最长子串&#xff0c;这个我们首先需要想到使用滑动窗口&#xff0c;窗口内记录无重复的子串的所有字符&#xff0c;移动窗口的右边界时&#xff0c;发现当前字符在窗口内已经出现&#xff0c…

unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效、伤害等没有触发

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题分析二、使用步骤2.玩家角色碰撞设置3.怪物角色碰撞预设 最终效果 前言 在使用unreal engine5制作动作类游戏时&#xff0c;我们使用刀剑等武器攻击怪物或敌方单位时&#xff0c;发现攻击特效、伤害等没有触发。检查动画…

二叉树进阶oj题【二叉树相关10道oj题的解析和c++代码实现】

目录 二叉树进阶oj题1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历 II4.二叉树的最近公共祖先5.二叉搜索树和双向链表6.从前序与中序遍历序列构造二叉树7.从中序和后序遍历序列来构造二叉树8.二叉树的前序遍历&#xff0c;非递归迭代实现9.二叉树中序遍历 &…

烟雾污染云层检测系统源码分享

烟雾污染云层检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

ssh方式连接上GitHub(超详细的哦)

目录 先检查本地有无生成过SSH key 生成 SSH Key&#xff08;如果没有的话&#xff09; 查看新生成的 SSH 公钥 添加新的 SSH Key 测试 SSH 连接 先检查本地有无生成过SSH key ls -al ~/.ssh终端输入以上命令查看 如果有应该能看到以下列表 id_rsa id_rsa.pub id_ed2551…

端侧Agent系列 | 端侧AI Agent任务拆解大师如何助力AI手机?(详解版)

引言 简介 Octo-planner 规划和执行Agent框架 规划数据集 基准设计 实验设计 结果 全量微调与LoRA 多LoRA训练与合并 不同基础模型的全量微调 不同数据集大小的全量微调 总结 实战 英文 中文示例1&#xff1a; 中文示例2&#xff1a; 0. 引言 人生到处知何似…

PREDATOR: Registration of 3D Point Clouds with Low Overlap

Abstract 这篇文章介绍了一种新的点云配准模型-Predator。该模型专注于处理低重叠的点云对&#xff0c;它更加关注于重叠区域的处理&#xff0c;其新颖之处在于一个重叠的注意块&#xff0c;作用是用于两个点云的潜在编码之间的早期信息交换。该模型大大提高了低重叠场景下的配…

【博弈强化学习】——UAV-BS 的联合功率分配和 3D 部署:基于博弈论的深度强化学习方法

【论文】&#xff1a;Joint Power Allocation and 3D Deployment for UAV-BSs: A Game Theory Based Deep Reinforcement Learning Approach 【引用】&#xff1a;Fu S, Feng X, Sultana A, et al. Joint power allocation and 3D deployment for UAV-BSs: A game theory based…

C++深入学习string类成员函数(3):访问与修饰

引言 在 C 中&#xff0c;std::string 提供了丰富的成员函数来访问和修改字符串中的字符。通过这些函数&#xff0c;程序员可以灵活地处理字符串中的各个元素&#xff0c;无论是读取特定位置的字符&#xff0c;还是修改字符串的内容。此外&#xff0c;std::string 类还确保了访…

农牧场可视化管理:精准监测与优化运营

利用图扑可视化技术实现农牧场的实时数据监测和分析&#xff0c;优化资源配置&#xff0c;提高生产效率和可持续发展能力。

无需安装移动端的互传工具“快速分享”

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 前不久给大家介绍过 Windows 自带的 Nearby Sharing 附近分享&#xff0c;只需要在手机上安装个 App 就可以与 Windows 进行互传。而今天介绍的“快速分享”正好相反&#xff0c;是在 Windows 上安装 Goog…

tomcat安装与部署

一、基础准备 1. 节点规划 IP 主机名 节点 192.168.200.70 tomcat Tomcat 2. 环境准备 准备一台虚拟机&#xff0c;镜像为CentOS-7-x86_64&#xff0c;下载两个软件包&#xff0c;apache-tomcat-9.0.95.tar.gz&#xff1b;zrlog WAR包。 二、安装Tomcat 1.基础环境配…

【C++篇】从零实现 `list` 容器:细粒度剖析与代码实现

文章目录 从零实现 list 容器&#xff1a;细粒度剖析与代码实现前言1. list 的核心数据结构节点结构分析 2 迭代器设计与实现2.1 为什么 list 需要迭代器&#xff1f;2.2 实现一个简单的迭代器2.3 测试简单迭代器解释&#xff1a; 2.4 增加后向移动和 -> 运算符关键点&#…

多模态——基于XrayGLM的X光片诊断的多模态大模型

0.引言 近年来&#xff0c;通用领域的大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT&#xff0c;已在遵循指令和生成类似人类的响应方面取得了显著成就。这些成就不仅推动了多模态大模型研究的热潮&#xff0c;也催生了如MiniGPT-4、mPLUG-Owl、Multimodal-G…

Synchronized和 ReentrantLock有什么区别?

目录 一、java中的线程同步 二、Synchronized 使用方式 底层原理 synchronized 同步代码块的情况 synchronized 修饰方法的情况 总结 synchronized 和 volatile 有什么区别&#xff1f; 三、ReentrantLock 底层原理 使用方式 四、Synchronized和 ReentrantLock有什…

GPIO端口的使用

目录 一. 前言 二. APB2外设时钟使能寄存器 三. GPIO端口的描述 四. GPIO端口使用案例 一. 前言 基于库函数的开发方式就是使用ST官方提供的封装好的函数。而如果没有添加库函数&#xff0c;那就是基于寄存器的开发方式&#xff0c;这种方式一般不是很推荐。因为由于ST对寄存…

docker pull 超时的问题如何解决

docker不能使用&#xff0c;使用之前的阿里云镜像失败。。。 搜了各种解决方法&#xff0c;感谢B站UP主 <iframe src"//player.bilibili.com/player.html?isOutsidetrue&aid113173361331402&bvidBV1KstBeEEQR&cid25942297878&p1" scrolling"…

维护左边枚举右边

前言&#xff1a;一开始遇到这个题目的时候没啥思路&#xff0c;但是当我看到值域在1000的时候我想着直接暴力从右边枚举不就行了吗&#xff0c;时间复杂度刚刚好&#xff0c;试一下就过了 正解应该是啥呢&#xff0c;其实也是维护一遍&#xff0c;运行另外一边 O ( n ) O(n)…

所有测试人,下半年的新方向(大模型),赢麻了!!!

现在做测试&#xff0c;真的挺累的。 现在测试越来越难做&#xff0c;晋升困难&#xff0c;工资迟迟不涨……公司裁员&#xff0c;测试首当其冲&#xff01;&#xff01; 做测试几年了&#xff0c;还没升职&#xff0c;就先到了“职业天花板”。 想凭工作几年积累的经验&…

Linux进程:fork函数深度剖析

目录 一、初识fork函数 二、fork函数的返回值 三、fork之后&#xff0c;父子进程谁先运行 四、fork的使用示例 一、初识fork函数 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 进程调用fork…