Expectation-Maximization Algorithm(EM算法)

news2024/12/24 21:43:33

EM算法Expectation-Maximization Algorithm,期望最大化算法)是一种迭代优化算法,主要用于在含有隐变量(未观测变量)不完全数据的概率模型中,估计参数的最大似然估计(Maximum Likelihood Estimation, MLE)或最大后验概率估计(Maximum A Posteriori, MAP)。它被广泛应用于各种机器学习问题,如混合高斯模型隐马尔可夫模型(HMM)等。

背景与动机

在许多统计问题中,数据并不总是完全观测的。例如,某些观测数据可能部分丢失,或存在无法直接测量的隐变量。在这种情况下,直接使用最大似然估计(MLE)来估计模型参数可能变得困难,因为我们无法明确地处理这些隐藏变量。

EM算法通过迭代更新参数,将原问题分解为两个步骤:期望步骤(E步)最大化步骤(M步),从而逐渐逼近参数的最大似然估计。

EM算法的基本思想

EM算法的核心思想是通过处理隐藏变量,优化含有不完全数据的似然函数。假设我们有观测到的数据集 X X X 和隐藏的(未观测到的)数据 Z Z Z,目标是通过观测数据 X X X 来估计模型的参数 θ \theta θ。由于隐藏变量的存在,我们的似然函数并不直接对 X X X 易于优化:

L ( θ ) = p ( X ∣ θ ) = ∫ p ( X , Z ∣ θ )   d Z L(\theta) = p(X | \theta) = \int p(X, Z | \theta) \, dZ L(θ)=p(Xθ)=p(X,Zθ)dZ

EM算法的关键在于,将隐变量的估计和参数更新分成两个步骤,每一步都相对简单:

  1. E步(期望步骤,Expectation Step):在给定当前参数 θ ( t ) \theta^{(t)} θ(t) 的情况下,计算后验概率分布 p ( Z ∣ X , θ ( t ) ) p(Z | X, \theta^{(t)}) p(ZX,θ(t)),并利用它来估计隐藏变量的期望值(或其相关量)。

  2. M步(最大化步骤,Maximization Step):使用E步计算的期望值,最大化含有隐藏变量的完全数据的对数似然函数,以更新模型参数 θ \theta θ

然后,重复进行E步和M步,直到参数收敛。

EM算法的步骤

假设我们有观测数据 X = { x 1 , x 2 , … , x n } X = \{x_1, x_2, \dots, x_n\} X={x1,x2,,xn} 和未观测到的隐藏数据 Z = { z 1 , z 2 , … , z n } Z = \{z_1, z_2, \dots, z_n\} Z={z1,z2,,zn},模型的参数为 θ \theta θ。EM算法的步骤可以描述如下:

  1. 初始化:随机初始化模型参数 θ ( 0 ) \theta^{(0)} θ(0)

  2. E步(期望步骤):根据当前参数 θ ( t ) \theta^{(t)} θ(t),计算隐藏变量的条件期望,即计算 Z Z Z 给定观测数据 X X X 和当前参数 θ ( t ) \theta^{(t)} θ(t) 的后验分布。

    在这个步骤中,我们计算的是Q函数
    Q ( θ ∣ θ ( t ) ) = E Z ∣ X , θ ( t ) [ log ⁡ p ( X , Z ∣ θ ) ] Q(\theta | \theta^{(t)}) = \mathbb{E}_{Z | X, \theta^{(t)}} \left[ \log p(X, Z | \theta) \right] Q(θθ(t))=EZX,θ(t)[logp(X,Zθ)]
    这个Q函数表示的是,在给定观测数据和当前参数的情况下,对完全数据对数似然的期望值。

  3. M步(最大化步骤):最大化Q函数,即找到使Q函数最大的参数 θ ( t + 1 ) \theta^{(t+1)} θ(t+1) ,即:
    θ ( t + 1 ) = arg ⁡ max ⁡ θ Q ( θ ∣ θ ( t ) ) \theta^{(t+1)} = \arg \max_{\theta} Q(\theta | \theta^{(t)}) θ(t+1)=argθmaxQ(θθ(t))
    这个步骤相当于通过更新参数,最大化含有隐藏数据的似然函数。

  4. 迭代:重复E步和M步,直到参数 θ \theta θ 收敛,通常是当两次迭代间的参数变化小于某个阈值时停止。

EM算法的直观解释

  • E步:估计隐变量的期望值,即在给定当前模型参数的情况下,推断出哪些隐藏变量更有可能产生当前的观测数据。
  • M步:最大化基于隐变量的完全数据似然,即根据E步得到的隐藏变量的估计,重新优化模型参数,使其更好地拟合观测数据。

EM算法的优势与劣势

优势
  1. 处理含隐变量的问题:EM算法特别适用于含有未观测变量或部分数据缺失的问题,这类问题通过直接优化似然函数通常较为复杂,而EM将问题分解为相对简单的两步,使之更易求解。
  2. 较广泛的应用范围:EM算法可以应用于各种不同的统计模型,如高斯混合模型(GMM)、隐马尔可夫模型(HMM)等。
  3. 局部收敛性:EM算法是收敛的,意味着它可以在有限的迭代次数内找到似然函数的一个局部极大值。
劣势
  1. 局部最优解:EM算法的收敛结果依赖于初始参数的选择,由于它只能保证找到一个局部最大值,因此可能会陷入局部最优解。
  2. 收敛速度慢:在某些情况下,EM算法的收敛速度较慢,特别是在接近极值时。
  3. 复杂的M步:对于某些复杂模型,M步中的最大化操作可能计算代价较高,需要数值方法来近似求解。

典型应用

  1. 混合高斯模型(Gaussian Mixture Models, GMM)
    EM算法广泛用于估计混合高斯模型的参数。混合高斯模型假设数据是由多个高斯分布生成的,每个数据点来自于某个未知的高斯成分,但我们不知道每个点来自于哪个高斯分布,因此这个成分就是隐变量。

  2. 隐马尔可夫模型(Hidden Markov Models, HMM)
    EM算法(特别是Baum-Welch算法)被广泛用于训练隐马尔可夫模型,用于在给定观测序列的情况下,估计隐状态转移和观测的概率。

  3. 数据缺失问题
    当数据集中存在缺失值时,EM算法可以用来处理缺失数据并估计数据分布的参数。


一个案例

使用EM算法来估计高斯混合模型(Gaussian Mixture Model, GMM)的参数。高斯混合模型是一种用于表示数据集的概率模型,它假设数据是由多个高斯分布混合而成的。

典型案例:高斯混合模型(GMM)

数据生成:生成一些合成数据,这些数据点来自两个高斯分布的混合。

步骤
1、数据生成:生成两个高斯分布的数据。
2、应用EM算法:使用EM算法来估计这两个分布的均值和方差。

import numpy as np
import matplotlib.pyplot as plt

# 生成数据
np.random.seed(42)
mean1, cov1, n1 = [0, 0], [[1, 0], [0, 1]], 300
mean2, cov2, n2 = [5, 5], [[1, 0], [0, 1]], 200

data1 = np.random.multivariate_normal(mean1, cov1, n1)
data2 = np.random.multivariate_normal(mean2, cov2, n2)
data = np.vstack((data1, data2))

# 可视化生成的数据
plt.scatter(data[:, 0], data[:, 1], alpha=0.5)
plt.title("Generated Data from Two Gaussian Distributions")
plt.xlabel("X1")
plt.ylabel("X2")
plt.axis('equal')
plt.show()

# GMM实现
class GaussianMixtureModel:
    def __init__(self, n_components, max_iter=100, tol=1e-3):
        self.n_components = n_components
        self.max_iter = max_iter
        self.tol = tol

    def fit(self, X):
        n_samples, n_features = X.shape
        self.weights = np.ones(self.n_components) / self.n_components
        self.means = X[np.random.choice(n_samples, self.n_components, False)]
        self.covs = [np.eye(n_features) for _ in range(self.n_components)]

        for _ in range(self.max_iter):
            responsibilities = self._e_step(X)
            self._m_step(X, responsibilities)

    def _e_step(self, X):
        likelihoods = np.array([
            self._multivariate_gaussian(X, self.means[k], self.covs[k])
            for k in range(self.n_components)
        ]).T
        weighted_likelihoods = self.weights * likelihoods
        return weighted_likelihoods / weighted_likelihoods.sum(axis=1, keepdims=True)

    def _m_step(self, X, responsibilities):
        N_k = responsibilities.sum(axis=0)
        self.means = (responsibilities.T @ X) / N_k[:, np.newaxis]
        self.covs = []
        for k in range(self.n_components):
            diff = X - self.means[k]
            cov = (responsibilities[:, k][:, np.newaxis] * diff).T @ diff / N_k[k]
            self.covs.append(cov + 1e-6 * np.eye(diff.shape[1]))  # 添加微小值以确保正定性
        self.weights = N_k / responsibilities.sum()

    def _multivariate_gaussian(self, X, mean, cov):
        n_features = X.shape[1]
        # 使用Cholesky分解以避免数值不稳定
        try:
            L = np.linalg.cholesky(cov)
            z = np.linalg.solve(L, (X - mean).T).T
            norm_const = 1 / ((2 * np.pi) ** (n_features / 2) * np.prod(np.diagonal(L)))
            return norm_const * np.exp(-0.5 * np.sum(z ** 2, axis=1))
        except np.linalg.LinAlgError:
            return np.zeros(X.shape[0])  # 返回零,表示协方差矩阵不正定

    def predict(self, X):
        likelihoods = np.array([
            self._multivariate_gaussian(X, self.means[k], self.covs[k])
            for k in range(self.n_components)
        ]).T
        return np.argmax(likelihoods * self.weights, axis=1)

# 实例化模型并训练
gmm = GaussianMixtureModel(n_components=2)
gmm.fit(data)

# 打印估计的参数
print("Estimated Means:\n", gmm.means)
print("Estimated Covariances:\n", gmm.covs)
print("Estimated Weights:\n", gmm.weights)

# 可视化估计的高斯分布
x, y = np.mgrid[-3:8:.01, -3:8:.01]
pos = np.dstack((x, y))

# 绘制每个高斯分布
for k in range(gmm.n_components):
    rv = gmm._multivariate_gaussian(pos.reshape(-1, 2), gmm.means[k], gmm.covs[k]).reshape(x.shape)
    plt.contour(x, y, rv, levels=5, alpha=0.5)

plt.scatter(data[:, 0], data[:, 1], alpha=0.5)
plt.title("GMM Result with Estimated Gaussian Components")
plt.xlabel("X1")
plt.ylabel("X2")
plt.axis('equal')
plt.show()

  • 数值稳定性:在更新协方差矩阵时,添加了一个小的正则化项 1e-6 * np.eye(diff.shape[1]),以确保协方差矩阵是正定的,防止在计算过程中出现不稳定性。
  • Cholesky分解:在计算多元高斯分布时,使用了Cholesky分解以提高数值稳定性。
  • 异常处理:在处理协方差矩阵时,如果协方差矩阵不正定,则返回零,避免程序崩溃。

可视化输出结果
在这里插入图片描述

Estimated Means:
 [[ 5.02497956  5.11190893]
 [-0.01082697 -0.01634693]]
Estimated Covariances:
 [array([[ 0.89950336, -0.08470736],
       [-0.08470736,  1.04855663]]), 
array([[0.95574948, 0.0127719 ],
       [0.0127719 , 0.9310602 ]])]
Estimated Weights:
 [0.40002096 0.59997904]

在这里插入图片描述

总结

EM算法是一种强大的迭代优化算法,专门用于在存在隐变量或不完全数据的情况下进行最大似然估计。它通过反复进行期望步骤(估计隐变量的期望)和最大化步骤(更新参数),逐步逼近似然函数的局部极值。尽管EM算法在某些情况下可能收敛到局部最优解,且收敛速度较慢,但它在许多实际应用中,如高斯混合模型、隐马尔可夫模型等,依然是非常有效的工具。

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

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

相关文章

【Kubernetes】常见面试题汇总(五十七)

目录 125. K8S 创建服务 status 为 ErrlmagePull? 126.不能进入指定容器内部? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目 …

【时时三省】(C语言基础)指针笔试题7

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 笔试题7 a是一个数组 a每个元素的类型是char* 它是一个指针数组 它有三个字符串 初始化了三个字符串 这个时候会产生三个字符串的首地址 第二行代码 a数组名 相当于数组名 第一个首元素…

k8s的pod管理及优化

资源管理介绍 资源管理方式 命令式对象管理:直接用命令去操作kubernetes资源 命令式对象配置:通过命令配置和配置文件去操作kubernets资源 声明式对象配置:通过apply命令和配置文件去操作kubernets资源 命令式对象管理: 资源类…

Linux驱动---ADC驱动

文章目录 一、电路图二、将ADC标准驱动选配到内核三、修改设备树文件四、实验现象 一、电路图 由电路图可知,两个电路测量分别通过ANA0和ANA1两个ADC通道完成 查看芯片手册可知,ANA0可作为ADC1的通道0和通道1,或者ADC2的通道0和通道1. ANA1…

如何在 ONLYOFFICE 文档中,将插件添加到右侧面板

通过自定义工具,可以提高您的工作效率。最新更新后,ONLYOFFICE 插件提供了更大的灵活性。在上一篇文章中,我们演示了如何将插件显示为选项卡。您也可以将插件面板放置在编辑器的左侧或右侧。在这篇文章中,我们将深入探讨此功能&am…

选型工单管理系统,从原理到应用全面解读

工单管理系统提升客户支持效率,优化内部协作,强化数据分析。选型需明确需求,比较系统功能和特性,评估试用后选择最适合的系统。ZohoDesk凭其多渠道支持、智能分配、自动化工具、协作工具和数据分析能力,成为企业优选。…

C语言 | Leetcode C语言题解之第449题序列化和反序列化二叉搜索树

题目: 题解: #define MAX_NODE_SIZE 10000void postOrder(struct TreeNode *root, int *arr, int *pos) {if (root NULL) {return;}postOrder(root->left, arr, pos);postOrder(root->right, arr, pos);arr[(*pos)] root->val; }struct Tree…

界面控件DevExpress中文教程 - 如何拓展具有AI功能的文本编辑器(一)

本文重点介绍了DevExpress在近年来最热门领域——人工智能(AI)和自然语言处理(NLP)的改进! NLP是人工智能的一个分支,它允许计算机与人类语言进行交互,这包括以有意义/有用的方式理解、解释、生成和回应文本(和语音)的能力。基于NLP的功能允…

ESP32-C3实现GPIO输入-判断高低电平

在 ESP32-C3 上实现 GPIO 输入并判断电平状态相对简单。以下是如何在 Arduino IDE 中配置 GPIO 作为输入,并在循环中检查电平状态的步骤: 1. 定义 GPIO 管脚 首先,定义你将要使用的 GPIO 管脚号。 #define GPIO_INPUT_PIN 2 // 定义一个 GP…

DAMA数据管理知识体系(第13章 数据质量)

课本内容 13.1 引言 语境图 图13-1 语境关系图:数据质量业务驱动因素 1)提高组织数据价值和数据利用的机会。2)降低低质量数据导致的风险和成本。3)提高组织效率和生产力。4)保护和提高组织的声誉。 提机会、降成本、增…

django(三):创建第一个django的app和url的两种获取参数的方式

一.创建第一个django的app 1.1 在终端根目录下执行命令 ## 创建一个app python manage.py startapp <app名称>例&#xff1a;python manage.py startapp book1.2创建成功后生成文件如下 二.url两种获取参数的方式 book/views.py from django.shortcuts import …

HTB:Markup[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What version of Apache is running on the targets port 80? 2.What username:password combination logs in successfully? 使用Yakit并使用TOP1000字典对密码进行爆破 3.What is the word at the top of the page that accepts use…

二叉搜索树(BST)简单讲解

概念&#xff1a; 二叉搜索树是一棵二叉树或者空树&#xff0c;又名二叉排序树&#xff0c;英文简写为 BST &#xff08;Binary Search Tree&#xff09; 性质&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xf…

使用C++写一个自己定义的图像格式,写入磁盘

看到OpenCV的Image类实例一副图像&#xff0c;觉得挺好玩&#xff0c;因此想自己定义一个自己的图像类&#xff0c;让后完成写盘&#xff0c;并且读取出来。没有办法&#xff0c;再利用一下OpenCV的imshow显示一下&#xff0c;看看和自己的预期是否一样。 首先要先定义一个图像…

养猫家庭有什么宠物空气净化器推荐吗?哪款吸毛效果最好?

不知道你们家的猫最近有没有大量掉毛&#xff1f;还是今早穿短袖感觉到有点冷&#xff0c;我才意识到秋天到了&#xff0c;新一轮的换毛季又来了。不仅和猫咪玩耍的时候可以“采摘”不少毛毛&#xff0c;而且家里的衣服上、地板上也被毛发入侵&#xff0c;感觉用不了多久&#…

Python基础之List列表用法

1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]&#xff1a;获取数组的第2个元素。 names[1:3]&#xff1a;获取数组的第2、第3个元素。包含左侧&#xff0c;不包含右侧。 names[:3]等同于names[0:3]&…

DAY3 JAVA基本语法

了解注释 注释是写在程序中对代码进行解释说明的文字,方便自己和其他人查看,以便理解程序的。 注释不影响程序的运行,编译后的class文件夹没有内容 字面量 在Java中,字面量(literal)是用来表示源代码中常量值的符号。 这些字面量可以直接出现在Java源代码中,并且它们代…

搜狗翻译体验,2024四大翻译工具解析!

为了满足广大用户的需求&#xff0c;市面上涌现出了众多优秀的翻译工具&#xff0c;福昕在线翻译、福昕翻译客户端、海鲸AI翻译、搜狗翻译等。今天&#xff0c;我们就来对比一下这些翻译工具&#xff0c;看看它们各自的特点和优势。 福昕在线翻译&#xff1a;专业精准&#xf…

前端初识之一

网页 什么是网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是HTML格式的文件&#xff0c;它要通过浏览器来阅读&#xff0c; 网页是构成网站的基本元素&#xff0c;它通常由…

【通过WSL2安装Ubuntu24.04系统及图形化界面】

WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个为Windows用户设计的兼容层&#xff0c;它允许用户在Windows10和Windows11操作系统上直接运行GNU/Linux环境。WSL提供了一个微软开发的Linux兼容内核接口&#xff0c;使得用户可以在不启动虚拟机或使用双重启动设…