热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习实战EM算法python3实现

EM算法送上,网络上原理到处都是,一定写的比我好,大家可以来参考一下python3的代码,原理可以看看别的大神的。1.算法原理EM算法是Dempster,Laind,Rubin

EM算法送上,网络上原理到处都是,一定写的比我好,大家可以来参考一下python3的代码,原理可以看看别的大神的。

 

1.算法原理

EM 算法是 Dempster,Laind,Rubin  1977 年提出的求参数极大似然估计的一种方法,它可以从非完整数据集中对参数进行 MLE 估计,是一种非常简单实用的学习算法。这种方法可以广泛地应用于处理缺损数据,截尾数据,带有噪声等所谓的不完全数据。

可以有一些比较形象的比喻说法把这个算法讲清楚。比如说食堂的大师傅炒了一份菜,要等分成两份给两个人吃,显然没有必要拿来天平一点的精确的去称分量,最简单的办法是先随意的把菜分到两个碗中,然后观察是否一样多,把比较多的那一份取出一点放到另一个碗中,这个过程一直迭代地执行下去,直到大家看不出两个碗所容纳的菜有什么分量上的不同为止。

EM算法就是这样,假设我们估计知道AB两个参数,在开始状态下二者都是未知的,并且知道了A的信息就可以得到B的信息,反过来知道了B也就得到了A。可以考虑首先赋予A某种初值,以此得到B的估计值,然后从B的当前值出发,重新估计A的取值,这个过程一直持续到收敛为止。

在统计学中,最大期望(EM)算法是在概率(probabilistic)模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variable)。最大期望经常用在机器学习和计算机视觉的数据聚类(Data Clustering)领域。

最大期望算法经过两个步骤交替进行计算  

1)计算期望(E),利用概率模型参数的现有估计值,计算隐藏变量的期望;

2)最大化(M),利用步上求得的隐藏变量的期望,对参数模型进行最大似然估计。

3M 步上找到的参数估计值被用于下一个 E 步计算中,这个过程不断交替进行。

总体来说,EM的算法流程如下:

1.初始化分布参数

2.重复直到收敛:

E步骤:估计未知参数的期望值,给出当前的参数估计。

M步骤:重新估计分布参数,以使得数据的似然性最大,给出未知变量的期望估计。


2. 总结

如果将样本看作观察值,潜在类别看作是隐藏变量,那么聚类问题也就是参数估计问题,只不过聚类问题中参数分为隐含类别变量和其他参数,这犹如在x-y坐标系中找一个曲线的极值,然而曲线函数不能直接求导,因此什么梯度下降方法就不适用了。但固定一个变量后,另外一个可以通过求导得到,因此可以使用坐标上升法,一次固定一个变量,对另外的求极值,最后逐步逼近极值。对应到EM上,E步估计隐含变量,M步估计其他参数,交替将极值推向最大。EM中还有指定和指定的概念,指定看似更为合理,但计算量要大,指定在某些场合如K-means中更为实用(要是保持一个样本点到其他所有中心的概率,就会很麻烦)。

Import  math

Import  copy

Import  numpy  as  np

import  matplotlib.pyplot  as  plt

isdebug = False

# 指定k个高斯分布参数,这里指定k=2。注意2个高斯分布具有相同均方差Sigma,分别为Mu1,Mu2

def ini_data(Sigma, Mu1, Mu2, k, N):

    global X  # X产生的数据 ,k维向量

    global Mu  # 初始均值

    global Expectations

    X = np.zeros((1, N))

    Mu = np.random.random(2)  # 随机产生一个初始均值。

    ExpectatiOns= np.zeros((N, k))  # k个高斯分布,100个二维向量组成的矩阵。

    for i in range(0, N):

        if np.random.random(1) > 0.5:

# 随机从均值为Mu1,Mu2的分布中取样。

            X[0, i] = np.random.normal() * Sigma + Mu1

        else:

            X[0, i] = np.random.normal() * Sigma + Mu2

        if isdebug:

            print("***********")

    print(u"初始观测数据X")

    print(X)

# EM算法:步骤1,计算E[zij]

def e_step(Sigma, k, N):

# 求期望。sigma协方差,k高斯混合模型数,N数据个数。

    global Expectations  # Nk维向量

    global Mu

    global X

    for i in range(0, N):

        Denom = 0

    for j in range(0, k):

        Denom += math.exp((-1 / (2 * (float(Sigma ** 2)))) * (float(X[0, i] - Mu[j])) ** 2)

# Denom  分母项  Mu(j)j个高斯分布的均值。

    for j in range(0, k):

        Numer = math.exp((-1 / (2 * (float(Sigma ** 2)))) * (float(X[0, i] - Mu[j])) ** 2)  # 分子项

    Expectations[i, j] = Numer / Denom  # 期望,计算出每一个高斯分布所占的期望,即该高斯分布以多大比例形成这个样本

# EM算法:步骤2,求最大化E[zij]的参数Mu

def m_step(k, N):

# 最大化

    global Expectations  # 期望值

    global X  # 数据

    for j in range(0, k):

# 遍历k个高斯混合模型数据

        Numer = 0  # 分子项

        Denom = 0  # 分母项

    for i in range(0, N):

        Numer += Expectations[i, j] * X[0, i]  # 每一个高斯分布的期望*该样本的值。

        Denom += Expectations[i, j]  # j个高斯分布的总期望值作为分母

        Mu[j] = Numer / Denom  # j个高斯分布新的均值,

# 算法迭代iter_num次,或达到精度Epsilon停止迭代

def run(Sigma, Mu1, Mu2, k, N, iter_num, Epsilon):

    ini_data(Sigma, Mu1, Mu2, k, N)

    print(X)

    print(u"初始:", Mu)  # 初始均值

    for i in range(iter_num):

        Old_Mu = copy.deepcopy(Mu)  # 算法之前的MU

        e_step(Sigma, k, N)

        m_step(k, N)

        print(i, Mu)  # 经过EM算法之后的MU

        if sum(abs(Mu - Old_Mu))

            break

if __name__ == '__main__':

    run(6, 40, 20, 2, 100, 100, 0.001)

    plt.hist(X[0, :], 50)

    plt.show()


结果:

初始观测数据X

[[ 34.78479349  40.8762506   12.9259573   17.16456673  16.3469559

   14.5410094   25.78720329  17.6779438   35.82670264  41.90071202

   50.52081174  26.38782308  21.04963529  14.56343039  38.21448941

   49.69993673  48.18442754  44.51268208  26.25675349  40.86309978

   44.02344275  41.49166553  21.55141972   5.75166566  34.16528679

   19.70743537  30.42653305  39.23467249  40.34117738  23.60869141

   28.5130148   17.287984    17.33970054  16.01856562  38.22256625

   34.81288304  15.24771646  42.2952032   49.09309169  53.95353144

   32.16791165  29.0789197   48.66267963  41.61831626  21.31745232

   35.886364    15.29341564  19.08278906  18.612558    50.07119199

   31.17027178  34.35832737  19.79392945  37.1648494   13.38859369

   15.28348077  21.86257621  28.53368242  18.00679612  29.3180723

   19.50236702  42.7221693   32.27174091  13.13910741  14.47212264

   29.98649409  46.30665712  32.14165658   2.84063103  25.67421301

   32.7497982   42.17391758  33.22993139  52.13921332  35.17490892

   45.82663241  41.61183305  20.31732587  15.17501376  22.13357363

   45.05877176  45.66095107  33.53623831  17.80499695  27.53976863

   24.60028367  27.87441091  18.43420556  30.05336577  16.23903851

   13.13443783  43.42828628  21.37174492  27.25854313  37.4277017 ]]

[[ 34.78479349  40.8762506   12.9259573   17.16456673  16.3469559

   14.5410094   25.78720329  17.6779438   35.82670264  41.90071202

   50.52081174  26.38782308  21.04963529  14.56343039  38.21448941

   49.69993673  48.18442754  44.51268208  26.25675349  40.86309978

   25.95215462  25.69322242  24.25158242  36.06655722  24.90611346

   44.02344275  41.49166553  21.55141972   5.75166566  34.16528679

   19.70743537  30.42653305  39.23467249  40.34117738  23.60869141

   28.5130148   17.287984    17.33970054  16.01856562  38.22256625

   34.81288304  15.24771646  42.2952032   49.09309169  53.95353144

   32.16791165  29.0789197   48.66267963  41.61831626  21.31745232

   35.886364    15.29341564  19.08278906  18.612558    50.07119199

   31.17027178  34.35832737  19.79392945  37.1648494   13.38859369

   15.28348077  21.86257621  28.53368242  18.00679612  29.3180723

   19.50236702  42.7221693   32.27174091  13.13910741  14.47212264

   29.98649409  46.30665712  32.14165658   2.84063103  25.67421301

   32.7497982   42.17391758  33.22993139  52.13921332  35.17490892

   45.82663241  41.61183305  20.31732587  15.17501376  22.13357363

   45.05877176  45.66095107  33.53623831  17.80499695  27.53976863

   24.60028367  27.87441091  18.43420556  30.05336577  16.23903851

   13.13443783  43.42828628  21.37174492  27.25854313  37.4277017 ]]

初始: [ 0.1492249   0.53474567]

0 [  0.1492249  37.4277017]

1 [  0.1492249  37.4277017]





推荐阅读
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 遗传算法中选择算子为何置于交叉算子和变异算子之前?本文探讨了这一问题,并详细介绍了遗传算法中常用的选择算子类型及其作用机制。此外,还分析了不同选择算子对算法性能的影响,为实际应用提供了理论依据。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 机器学习中的标准化缩放、最小-最大缩放及鲁棒缩放技术解析 ... [详细]
  • 本文详细介绍了如何使用Python的多进程技术来高效地分块读取超大文件,并将其输出为多个文件。通过这种方式,可以显著提高读取速度和处理效率。 ... [详细]
  • 哈希表(Hash Table)是一种高效的查找算法,与传统的链表和树结构相比,其在查找过程中无需进行逐个元素的比较。本文将深入探讨哈希表的基本原理、应用场景以及优化策略,帮助读者全面理解其在实际开发中的优势和局限性。通过实例分析和代码示例,我们将展示如何有效利用哈希表提高数据处理效率,并解决常见的冲突问题。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
author-avatar
郁雯佩菱2
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有