EM算法学习总结

news2025/1/4 19:32:44

这个和我的硕士毕业论文的题目就有一定关系,我的导师让我按时向她汇报学习进度。然而我还在进行实习,还要准备自己明年的秋招,只能想办法游走于三者之间。

EM算法是一个常用的数据挖掘算法,想必从事数据挖掘的相关工作的同学一定比较熟悉,至少是有所耳闻。

1 EM算法的概念和介绍

1.1 一些基本概念

EM算法(Expectation-Maximization Algorithm)是一种通过不断迭代进而使模型的参数收敛,进而得到模型参数的算法。常用于具有隐变量的参数估计(极大似然估计或者极大后验概率估计)。

隐变量是不可观测的随机变量,我们通常通过可观测变量的样本对隐变量作出推断。简而言之,我们手里有一堆数据,我们需要将这对数据分成很多类别,但这些数据并没有任何标签信息。虽然没有标签信息但是这些数据都有很多特征变量,我们可以根据这些特征变量给这些数据进行人为的分类,这便称为”聚类“。而用来标记划分出来的各个类别的那个变量便是”隐变量“。因此,EM算法是一种无监督学习。

极大似然估计(MLE)极大后验概率估计(MAP)是有一定区别的。简而言之,极大后验概率估计考虑先验知识对统计结果的影响,和极大似然估计只是从统计结果得到的频率出发,并不考虑这个频率是否一定符合所有情况(因为,当样本数量不够多的时候,统计结果得到的频率可能并不准确)。具体的区别可以简单地认为极大后验概率估计MAP在优化时比极大似然估计MLE多了一个先验项。详细内容可以参考这位博主的文章:

极大似然估计与最大后验概率估计的区别https://zhuanlan.zhihu.com/p/40024110

1.2 EM算法的大致思想

首先根据己经给出的观测数据,估计出模型参数的值(初始化);然后再依据上一步估计出的参数值估计缺失数据的值,再根据估计出的缺失数据加上之前己经观测到的数据重新再对参数值进行估计,然后反复迭代,直至最后收敛,迭代结束。

1.3 EM算法的具体步骤

  1. 先得给予需要估计的参数一个值。
  2. 进行”E步“的操作:利用现有样本对隐变量进行参数估计,求出隐变量的期望,以初步判断期望样本属于哪一类。
  3. 进行”M步“的操作:根据上一步E步求得的隐变量的结果,通过参数估计(一般是MLE或者MAP)得到新的参数值。
  4. 将”M步“得到的新的参数数值重新代入步骤二(E步),然后反复迭代,经过多个E步和M步直至收敛。

如果要我举一个例子的的话,我觉得还是网上抛硬币那个更容易理解。对于这个例子,只是有些人写的容易理解,有些人写的让人看不懂,从本身来讲这个例子讲的是很清晰,很不错的。这里我推荐这位博主的文章。他在自己博客第三章:《EM算法》,的第一节:《举例说明EM算法用来干啥》中,解释的还是相当清楚的,具体内容我就不特意转载了,这里给出链接:

EM算法详解(请看第三章第一节:《举例说明EM算法用来干啥》)https://zhuanlan.zhihu.com/p/367714302

2 EM算法的推导和代码实现

2.1 EM算法的推导

        下面给出EM算法各个步骤的公式,接着对公式进行推导。假设在第i次迭代后参数的估计值为\theta^{(i)},对于第i+1次迭代,分为两步:

  • E步,求期望:
    • Q(\theta ,\theta^{(i)})=\sum_{Z}\left ( Z|X,\theta^{(i)} \right )logP(X,Z|\theta)=E_{Z|X,\theta^{(i)}}\left [ logP(X,Z|\theta) \right ]
  • M步,最大化:
    • \theta^{(i+1)}=argmaxQ(\theta,\theta^{(i)})

        其中,Q(\theta ,\theta^{(i)})被称为Q函数,是EM算法的核心。Q函数的推导如下:给定一组观测数据记为X=(x_{1}, x_{2}, ..., x_{n}),以及参数\theta。假设x_{1}, x_{2}, ..., x_{n}是独立同分布,因此有以下的对数似然函数:

\iota(\theta|X)=logP(X|\theta)=log\left ( \prod _{i=1}^{n}P(x_{i}|\theta) \right )=\sum _{i=1}^{n}logP(x_{i}|\theta)

      可以通过极大似然估计来求解最优参数,即:

\widehat{\theta}=argmaxlog\iota(\theta|X)=argmax\sum_{i=1}^{n}logP(x_{i}|\theta)

        但是由于隐变量的存在,logP(X|\theta)变为

logP(X|\theta)=log\sum_{Z}P(X,Z|\theta)=log(\sum_{Z}P(X|\theta,Z)P(Z|\theta))

        累加使得直接求解式,变得十分困难。一个办法是通过构造一个容易优化的有关对数似然函数的下界函数,通过不断迭代优化下界,从而逼近最优参数。

        记隐变量Z的概率分布q(Z),满足:

\sum_{Z}q(Z)=1

        有以下等式成立:

P(X|\theta)=\frac{P(X,Z|\theta)}{P(Z|X,\theta)}=\frac{P(X,Z|\theta)/q(Z)}{P(Z|X,\theta)/q(Z)}

        两边同时取对数

logP(X|\theta)=log\frac{P(X,Z|\theta)/q(Z)}{P(Z|X,\theta)/q(Z)}

        同时求两边在Z上的期望

E_{Z}[logP(X|\theta)]=E_{Z}log\frac{P(X,Z|\theta)/q(Z)}{P(Z|X,\theta)/q(Z)}

        因为logP(X|\theta)与Z无关,所以求期望仍然不变:

E_{Z}[logP(X|\theta)]=\sum_{Z}q(Z)logP(X|\theta)=logP(X|\theta)\sum_{Z}q(Z)=logP(X|\theta)

        接着,将右边展开

E_{Z}log\frac{P(X,Z|\theta)/q(Z)}{P(Z|X,\theta)/q(Z)}=\sum_{Z}q(Z)log\frac{P(X,Z|\theta)/q(Z)}{P(Z|X,\theta)/q(Z)}=\sum_{Z}q(Z)log\frac{P(X,Z|\theta)}{q(Z)}-\sum_{Z}q(Z)log\frac{P(Z|X,\theta)}{q(Z)}=\sum_{Z}q(Z)log\frac{P(X,Z|\theta)}{q(Z)}-\sum_{Z}q(Z)log\frac{q(Z)}{P(Z|X,\theta)}=\sum_{Z}q(Z)log\frac{P(X,Z|\theta)}{q(Z)}+KL(q(Z)||P(Z|X,\theta))\geq \sum_{Z}q(Z)log\frac{P(X,Z|\theta)}{q(Z)}

        其中,KL是相对熵

KL(p||q)=\sum_{x\epsilon X}p(x)log\frac{p(x)}{q(x)}

        以上,便是E步骤的全部。由\hat{\theta}=\theta^{(i+1)},可以得到M步的公式:

\theta^{(i+1)}=argmaxE_{Z|X,\theta^{(i)}}[logP(X,Z|\theta)]

2.1 EM算法的代码实现

未完待续...

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

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

相关文章

机器人操作系统ROS/ROS2(1)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、ROS和ROS2是什么?二、ROS2安装步骤1.Ubuntu虚拟机安装2.ROS2系统安装3.验证ROS2安装成功4.小海龟仿真示例总结前言 提示:这里可以添…

LeetCode刷题模版:21 - 30

目录 简介21. 合并两个有序链表22. 括号生成23. 合并K个升序链表24. 两两交换链表中的节点25. K 个一组翻转链表26. 删除有序数组中的重复项27. 移除元素28. 找出字符串中第一个匹配项的下标29. 两数相除【未理解】30. 串联所有单词的子串【未理解】结语简介 Hello! 非常感谢您…

devops 是什么东东了

DevOps,字面意思是Development &Operations的缩写。 DevOps是从实践中逐步总结提炼出的方法论理念。近而创造了DevOps这个词。 DevOps概念的萌芽阶段: 2008年敏捷大会上,来自Patrick Debois发表了题为 《Agile Infrastructure & Op…

基于.NET技术的动漫管理系统,给各位二次元老司机提供的动漫管理平台,基于.NET的前后端框架Blazor,含安装教程及使用说明

介绍 老司机驾驶舱——给各位二次元老司机提供的动漫管理平台。 下载地址:基于.NET技术的动漫管理系统 编写本应用的目的主要是实践巨硬(Microsoft)的新一代前端框架Blazor与EntityFramework,本应用也给想要学习这套框架的童鞋提…

Ubuntu20.04 hyperledger fabric2.4基于Docker搭建blockchain-explorer

准备 启动fabric测试网络。   这里默认已经完成了Fabric测试网络搭建以及运行。   后续会出Fabric安装,现在不会的就先去看别的博客 配置 1.在test-network 文件夹下面建立explorer文件夹: mkdir explorer2. 配置文件 2.1下载配置文件 先进文件…

Isaac Sim 机器人仿真器介绍、安装与 Docker [1]

前言与参考 此文书写于: January 6, 2023, 更新于 January 6, 2023 ;可能会随着时间的变化 此教程会有过时概念哦 Isaac Sim 相关参考链接: 官方文档地址官方docker image 镜像地址官方讨论 论坛链接,建议没啥事就可…

【JavaGuide面试总结】Java基础篇·中

【JavaGuide面试总结】Java基础篇中1.重载和重写有什么区别?2.什么是可变长参数?3.为什么浮点数运算的时候会有精度丢失的风险?4.如何解决浮点数运算的精度丢失问题?5.超过 long 整型的数据应该如何表示?6.基本类型和包…

JSP——标准标签库 (JSTL)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

5G NR标准: 第19章 毫米波射频技术

第19章 毫米波射频技术 现有的 2G、3G 和 4G 移动通信 3GPP 规范适用于 6 GHz 以下的频率范围,相应的 RF 要求考虑了与 6 GHz 以下操作相关的技术方面。 NR 也在这些频率范围内运行(标识为频率范围 1),但另外还将定义为在 24.25…

【人工智能原理自学】梯度下降和反向传播:能改

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 🔔本文讲解梯度下降和反向传播:能改,一起卷起来叭! 目录一、“挪…

Rollup Decentralization

1. 引言 当前的Rollup为中心化的,这并不是必须的,而是当前的选择。 2. 何为Rollup? Rollup与其它L2或侧链的主要区别在于: L1数据可用性 Rollup:只要L1的数据可用性存在,用户可重构L2状态,然…

SQL LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。 SQL LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。 SQL LIKE 语法 SELECT column1, column2, ... FROM table_name WHERE column LIKE pattern; 参数说明: column1, column2, ...&…

php://filter伪协议(总结)

文章目录php://filter伪协议总结php://filter伪协议介绍php://filter伪协议使用方法php://filter过滤器分类filter字符串过滤器string.rot13string.toupperstring.tolowerstring.strip_tagsfilter转换过滤器convert.base64-encodeconvert.base64-decodeconvert.quoted-printabl…

【Kotlin】空安全 ① ( Kotlin 的空安全机制 | 变量可空性 | 默认变量不可赋空值 | 声明可空类型变量 )

文章目录一、Kotlin 的空安全机制二、变量可空性1、默认变量不可赋空值2、声明可空类型变量一、Kotlin 的空安全机制 Java 中的空指针问题 : 在 Java 语言 编写的程序中 , 出现最多的崩溃就是 NullPointerException 空指针异常 , 该异常是 运行时 才爆出的 , 在 代码编写时 以…

冰冰学习笔记:C++11的新特性

欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位…

k8s入门教程

文章导读 kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。 kubernetes的本质是一组服务器集群&…

创建自己的docker镜像

dockerfile案例1导入dockerfiel以及java文件导入后第一步docker build -t javaweb:1.0 .docker build -t (名称以及对应的版本)javaweb:1.0 .(空格之后的一个点表示从当前目录开始)导入成功之后运行容器即可docker run --name web…

二十七、linux系统详解

一、Linux基础篇 1. Linux目录结构 ⑴ 基本介绍: linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。 深刻理解linux树状文件目录是非常重要的,这里我给大家说明一下。 记住一…

Markdown生成目录结构的方法

参考文章:https://www.cnblogs.com/abc-x/p/13470575.htmlmarkdown生成目录结构的方法:示例:project│ README.md│ file001.txt │└───folder1│ │ file011.txt│ │ file012.txt│ ││ └───subfolder1│ │ file111.txt│ │ fil…

【Linux多线程编程】5. 线程锁(2)——死锁、读写锁

前言 上篇文章【Linux多线程编程】4. 线程锁(1)——互斥锁 我们介绍了线程同步的其中一种方式——互斥锁,互斥锁也可以理解为独占锁,只要有一个线程拿到该锁,其他的线程想要获取只能阻塞等待。但互斥锁的使用不当也可…