机器学习_16_EM算法

部署运行你感兴趣的模型镜像

1 最大似然估计(MLE)

MLE就是利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值的计算过程。直白来讲,就是给定了一定的数据,假定知道数据是从某种分布中随机抽取出来的,但是不知道这个分布具体的参数值,即 “模型已定,参数未 知” ,MLE就可以用来估计模型的参数。MLE的目标是找出一组参数(模型中的参数),使得模型产出观察数据的概率最大

在这里插入图片描述

1.1 MLE求解过程

  • 编写似然函数(即联合概率函数)<似然函数:在样本固定的情况下,样本出现的概率与参数θ之间的函数;
  • 对似然函数取对数,并整理;(一般都进行)
  • 求导数;
  • 解似然方程。

在这里插入图片描述

1.2 MLE案例

  • 盒子中只有黑球和白球,假定白球的比例为p,那么黑球的比例为1-p。因为采取的是有放回的随机抽取,那么每次抽取出来的球的颜色服从同一独立分布情况,即每次抽取之间是独立互不影响的。

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

2 贝叶斯算法估计

贝叶斯算法估计是一种从先验概率和样本分布情况来计算后验概率的一种方式。

贝叶斯算法中的常见概念:

  • P(A)是事件A的先验概率或者边缘概率;
  • P(A|B)是已知B发生后A发生的条件概率,也称为A的后验概率;
  • P(B|A)是已知A发生后B发生的条件概率,也称为B的后验概率;
  • P(B)是事件B的先验概率或者边缘概率。

在这里插入图片描述

2.1 贝叶斯算法估计—案例

  • 现在有五个盒子,假定每个盒子中都有黑白两种球,并且黑白球的比例如下;现已知从这五个盒子中的任意一个盒子中有放回的抽取两个球,且均为白球,问这两个球是从哪个盒子中抽取出来的?

在这里插入图片描述

  • 现在不是从五个盒子中任选一个盒子进行抽取,而是按照一定的概率选择对应的盒子,概率如下。假定抽出白球为事件B,从第i个盒子中抽取为事件Ai。结论是从第四个盒子抽取的球

在这里插入图片描述

2.2 最大后验概率估计(MAP)

  • MAP(Maximum a posteriori estimation)和MLE一样,都是通过样本估计参数θ的值;在MLE中,是使似然函数P(x|θ)最大的时候参数θ的值,MLE中假设先验概率是一个等值的;而在MAP中,则是求θ使P(x|θ)P(θ)的值最大,这也就是要求θ值不仅仅是让似然函数最大,同时要求θ本身出现的先验概率也得比较大。
  • 可以认为MAP贝叶斯算法的一种应用。

在这里插入图片描述

3 K-means算法

在这里插入图片描述

4 EM算法

EM算法(Expectation Maximization Algorithm, 最大期望算法)是一种迭代类型的算法,是一种在概率模型中寻找参数最大似然估计或者最大后验估计的算法, 其中概率模型依赖于无法观测的隐藏变量。

4.1 Jensen不等式

在这里插入图片描述

4.2 EM算法原理

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

4.3 EM算法流程

  • 初始化分布参数/模型参数。
  • 重复下列两个操作直到收敛:
    • E步骤:估计隐藏变量的概率分布期望函数;
    • M步骤:根据期望函数重新估计分布参数。

在这里插入图片描述

4.4 EM算法直观案例

  • 假设现有两个装有不定数量黑球、白球的盒子,随机从盒子中抽取出一个白球的概率分布为p1和p2;为了估计这两个概率,每次选择一个盒子,有放回的连续随机抽取5个球,记录如下:

在这里插入图片描述

  • 假设现有两个装有不定数量黑球、白球的盒子,随机从盒子中抽取出一个白球的概率分布为p1和p2如果现在不知道具体的盒子编号,但是同样还是为了求解p1和p2的值,这个时候就相当于多了一个隐藏变量z, z表示的是每次抽取的时候选择的盒子编号,比如z1就表示第一次抽取的时候选择的是盒子1还是盒子2。

在这里插入图片描述

在这里插入图片描述

4.5 EM算法收敛证明

  • EM算法的收敛性只要我们能够证明对数似然函数的值在迭代的过程中是增加的即可

在这里插入图片描述

4.6 问题

随机选择1000名用户,测量用户的身高;若样本中存在男性和女性,身高分别服从高斯分布N(μ11 )和N(μ22 )的分布,试估计参数:μ1122 ;

  • 如果明确的知道样本的情况(即男性和女性数据是分开的),那么我们使用极大似然估计来估计这个参数值。
  • 如果样本是混合而成的,不能明确的区分开,那么就没法直接使用极大似然估计来进行参数的估计啦,像这样存在隐变量的模型参数求解就需要用到EM算法求解。

5 GMM算法

  • GMM(Gaussian Mixture Model, 高斯混合模型)是指该算法由多个高斯模型线性叠加混合而成。每个高斯模型称之为component。GMM算法描述的是数据的本身存在的一种分布。
  • GMM算法常用于聚类应用中,component的个数就可以认为是类别的数量。
  • 假定GMM由k个Gaussian分布线性叠加而成,那么概率密度函数如下:

在这里插入图片描述

5.1 GMM-EM算法求解

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

5.2 基于python的GMM高斯混合代码实现

# --encoding:utf-8 --
"""
实现GMM高斯混合聚类
根据EM算法流程实现这个流程
http://scipy.github.io/devdocs/generated/scipy.stats.multivariate_normal.html#scipy.stats.multivariate_normal
"""
import numpy as np
from scipy.stats import multivariate_normal


def train(x, max_iter=100):
    """
    进行GMM模型训练,并返回对应的μ和σ的值(假定x数据中的簇类别数目为2)
    :param x: 输入的特征矩阵x
    :param max_iter:  最大的迭代次数
    :return:  返回一个五元组(pi, μ1, μ2,σ1,σ2)
    """
    # 1. 获取样本的数量m以及特征维度n
    m, n = np.shape(x)

    # 2. 初始化相关变量
    # 以每一列中的最小值作为mu1,mu1中的元素数目就是列的数目(n)个
    mu1 = x.min(axis=0)
    mu2 = x.max(axis=0)
    sigma1 = np.identity(n)
    sigma2 = np.identity(n)
    pi = 0.5

    # 3. 实现EM算法
    for i in range(max_iter):
        # a. 初始化多元高斯分布(初始化两个多元高斯混合概率密度函数)
        norm1 = multivariate_normal(mu1, sigma1)
        norm2 = multivariate_normal(mu2, sigma2)

        # E step
        # 计算所有样本数据在norm1和norm2中的概率
        tau1 = pi * norm1.pdf(x)
        tau2 = (1 - pi) * norm2.pdf(x)
        # 概率做一个归一化操作
        w = tau1 / (tau1 + tau2)

        # M step
        mu1 = np.dot(w, x) / np.sum(w)
        mu2 = np.dot(1 - w, x) / np.sum(1 - w)
        sigma1 = np.dot(w * (x - mu1).T, (x - mu1)) / np.sum(w)
        sigma2 = np.dot((1 - w) * (x - mu2).T, (x - mu2)) / np.sum(1 - w)
        pi = np.sum(w) / m

    # 返回最终解
    return (pi, mu1, mu2, sigma1, sigma2)


if __name__ == '__main__':
    np.random.seed(28)

    # 产生一个服从多元高斯分布的数据(标准正态分布的多元高斯数据)
    mean1 = (0, 0, 0)  # x1\x2\x3的数据分布都是服从正态分布的,同时均值均为0
    cov1 = np.diag((1, 1, 1))
    data1 = np.random.multivariate_normal(mean=mean1, cov=cov1, size=500)

    # 产生一个数据分布不均衡
    mean2 = (2, 2, 3)
    cov2 = np.array([[1, 1, 3], [1, 2, 1], [0, 0, 1]])
    data2 = np.random.multivariate_normal(mean=mean2, cov=cov2, size=200)

    # 合并两个数据
    data = np.vstack((data1, data2))

    pi, mu1, mu2, sigma1, sigma2 = train(data, 100)
    print("第一个类别的相关参数:")
    print(mu1)
    print(sigma1)
    print("第二个类别的相关参数:")
    print(mu2)
    print(sigma2)

    print("预测样本属于那个类别(概率越大就是那个类别):")
    norm1 = multivariate_normal(mu1, sigma1)
    norm2 = multivariate_normal(mu2, sigma2)
    x = np.array([0, 1, 0])
    print(pi * norm1.pdf(x)) # 属于类别1的概率为:0.0275  =>0.0275/( 0.0275+0.0003)=0.989
    print((1 - pi) * norm2.pdf(x))# 属于类别1的概率为:0.0003 => 0.011

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少云清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值