数据挖掘十大算法(八):EM期望最大化算法

本文深入探讨了EM算法的工作原理,通过极大似然估计和Jensen不等式的预备知识引入,详细介绍了EM算法的流程,并提供了Python实现示例。通过一个具体的实例,展示了如何使用EM算法来估计混合高斯分布的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、预备知识

极大似然估计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Jensen不等式

在这里插入图片描述
在这里插入图片描述

二、EM算法

问题描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们这里不再具体推导EM算法,太南了~~~

EM算法流程

在这里插入图片描述

三、EM算法实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、EM算法的Python实现

在这里插入图片描述

# coding:UTF-8
'''
Created on 2019年12月24日
@author: NanShan
'''
from __future__ import division
import numpy as np
import math as mt

# 首先生成一些用于测试的样本
# 指定参数(均值)
sigma = 5
miu_1 = 45
miu_2 = 60

# 随机均匀选择两个高斯分布,用于生成样本值
N = 1000
X = np.zeros((1, N))



for i in range(N):
    if np.random.random() > 0.5:  # 使用的是numpy模块中的random
        X[0, i] = np.random.randn() * sigma + miu_1
    else:
        X[0, i] = np.random.randn() * sigma + miu_2

# 上述步骤已经生成样本
# 对生成的样本,使用EM算法计算其均值miu

# 取miu的初始值
k = 2
miu = np.random.random((1, k))
Expectations = np.zeros((N, k))

for step in range(500):  # 设置迭代次数
    # 步骤1,E步
    for i in range(N):
        # 计算分母
        denominator = 0
        for j in range(k):
            denominator = denominator + mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2)

        # 计算分子
        for j in range(k):
            numerator = mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2)
            Expectations[i, j] = numerator / denominator

    # 步骤2,M步
    oldMiu = np.zeros((1, k))
    for j in range(k):
        oldMiu[0, j] = miu[0, j]
        numerator = 0
        denominator = 0
        for i in range(N):
            numerator = numerator + Expectations[i, j] * X[0, i]
            denominator = denominator + Expectations[i, j]
        miu[0, j] = numerator / denominator

    # 判断是否满足要求(这个精度已经相当可以啦)
    epsilon = 0.000000001


    if np.sum(np.abs(miu-oldMiu)) < epsilon:
        print('退出时训练的轮数:', step)
        print('最后预测的均值为:', miu)
        break


print('最后预测的均值为:', miu)

输出结果:
在这里插入图片描述

五、应用

如果将样本看作观察值,潜在类别看作是隐藏变量,那么聚类问题也就是参数估计问题,只不过聚类问题中参数分为隐含类别变量和其他参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值