导读:极大似然估计(MLE) 是统计机器学习中最基本的概念,但是能真正全面深入地理解它的性质和背后和其他基本理论的关系不是件容易的事情。极大似然估计和以下概念都有着紧密的联系:随机变量,无偏性质(unbiasedness),一致估计(consistent),asymptotic normality,最优化(optimization),Fisher Information,MAP(最大后验估计),KL-Divergence,sufficient statistics等。在众多阐述 MLE 的文章或者课程中,总体来说都比较抽象,注重公式推导。本系列文章受 3blue1brown 可视化教学的启发,坚持从第一性原理出发,通过数学原理结合模拟和动画,深入浅出地让读者理解极大似然估计。

相关链接:

用逆变换采样方法构建随机变量生成器

从零构建统计随机变量生成器之离散基础篇

抛硬币问题

我们来思考这个老套问题,考虑手上有一枚硬币,旋转(抛)硬币得到正反面的概率固定(令正面概率为









)但未知,我们如何能通过实验推测出









朴素的想法是,不断尝试抛硬币,随着次数 n 的增多,正面的比例会趋近于









对应到数学形式上,令我们对于









的估计为














,则希望







































模拟试验代码

假设我们尝试了n次,每次的结果为















为1(正面) 或 0(反面)。比如试了三次的结果是 [1, 0, 1],则























。一般,我们将观察到的数据写成向量形式







































我们知道硬币的正反结果符合伯努利分布,也就是

因为 x 只有0,1两种取值,因此上式也可以写成等价如下的不含条件分支的形式



























假设











,如果做 n=10 次试验,结果应该比较接近7个1,3个0。

下面我们来模拟一下 n=10,看看结果如何。

下面代码的实现上我们直接使用了pytorch 内置的 bernoulli 函数生成 n 个随机变量实例

def gen_coins(theta, n=1):import torchtheta_vec = torch.tensor(n*[theta])random_values = torch.bernoulli(theta_vec)return random_values

让我们来做三次 n=10 的试验

for i in range(3):coins = gen_coins(theta=0.7, n=10)print(f'trial {i}')print(f'head #: {sum(coins)}')print(f'tail #: {sum(1-coins)}')print()

能发现 7个1,3个0 确实是比较可能的结果。

trial 0
head #: 7.0
tail #: 3.0trial 1
head #: 9.0
tail #: 1.0trial 2
head #: 7.0
tail #: 3.0

生成概率

直觉告诉我们,当











时,根据
















,7个1,3个0 出现的概率应该是最大,6个1,4个0 或者 8个1,2个0 这两种情况出现概率稍小,其他的情况概率更小。通过基本概率和伯努利公式,重复 n 次试验 1和0出现的概率可以由下面公式算出。(注:7个1,3个0不是单一事件,需要乘以组合数算出实际概率)

P(X)
head=0 0.000006
head=1 0.000138
head=2 0.000032
head=3 0.001447
head=4 0.036757
head=5 0.102919
head=6 0.200121
head=7 0.266828
head=8 0.233474
head=9 0.121061
head=10 0.028248

画出图看的很明显,1出现7次的概率确实最大。

回到我们的问题,我们先假定











的硬币做 n=10 次试验的结果就是 7个1,3个0,或者具体序列为 [1, 0, 0, 1, 0, 1, 1, 1, 1, 1]。那么我们希望按照某种方法推测的估计值









也为 0.7。

若将这个方法也记做









,它是




的函数

我们如何构建这个方法呢?很显然,




中 1 的个数就可以胜任,
















。这个方式确实是正确的,后面的文章我们也会证明它是MLE在伯努利分布参数估计时的计算方法。

但是伯努利分布参数估计的问题中是最简单的情况,背后对应的更一般的问题是:假设我们知道某个过程或者实验生成了某种分布 P,但是不知道它的参数




,如何能通过反复的试验来推断




,同时,我们希望随着试验次数的增多,









能逼近




由于过程是有随机性,试验结果




并不能确定一定是从









生成的,因此我们需要对所有




打分。对于抛硬币试验来说,我们穷举所有在 [0, 1] 范围内的




,定义它的打分函数







,并且希望我们定义的  在






时得分最高。推广到一般场景,有如下性质





















如此,我们将推测参数问题转换成了优化问题

朴素方法

一种朴素的想法是,由于









,因此我们每次的结果应该稍微偏向 1,如果出现了 1,就记0.7分,出现了0,记0.3分,那么我们可以用10个结果的总分来定义总得分,即最大化函数

很可惜,我们定义的 f 并不符合






时取到最大的原则。下面画出了




在 [0, 1] 范围内 f 值,X 固定为 [1, 0, 0, 1, 0, 1, 1, 1, 1, 1]。显然,极值在 0.5 左右。

这种对于观察到的变量实例在整个参数空间打分的方法是最大似然方法的雏形。我们将每次试验结果对于不同




的打分就是似然函数的概念。

伯努利似然函数(Likelihood)

伯努利单个结果的似然函数







视为




的函数,x视为给定值,它等价于概率质量函数 PMF

























极大似然估计(MLE)

有了单个结果的似然函数,我们如何定义







呢?我们定义的







需要满足,在  
















的情况下,试验最有可能的结果是 7 个1,3个0,此时 f 需要在






时取到最大值。

极大似然估计(MLE) 为我们定义了合理的







,和朴素的想法类似,但是这次用单个结果的似然函数连乘而非连加

我们再来看一下当


























时  









空间的取值情况,果然,MLE 能在 0.7时取到最大值。

对数似然函数

最大似然函数













能让我们找到最可能的




,但现实中,我们一般采用最大其 log 的形式。

理论能证明,最大对数似然函数得到的极值等价于最大似然函数。但这么做有什么额外好处呢?

我们先将对数似然函数画出来

它的极大值也在 0.7,但是我们发现对数似然函数是个 concave 函数。在优化领域,最大化 concave 函数或者最小化 convex 函数可以有非常高效的解法。再仔细看之前的似然函数,它并不是一个 concave 函数。另一个非常重要的好处是,随着 n 的增大,连乘会导致浮点数 underflow,而单个点的对数似然函数的和的形式就不会有这个问题。

Pytorch MLE 实践

就让我们来实践一下,通过 pytorch 梯度下降来找到极值点。为什么是梯度下降呢,因为我们在代码中的 loss 是上面对数似然函数取负值,这个就是最常见的负对数似然 loss (NLL)。

from stats.coin import gen_coins
from collections import dequedef train(num_head: int, num_tail: int) -> float:import torchtheta = torch.tensor(0.5, requires_grad=True)recent = deque(3*[100], maxlen=3)lr = 0.00001for iter in range(2000):loss = -(num_head * torch.log(theta) + num_tail * torch.log(1 - theta))loss.backward()with torch.no_grad():theta -= lr * theta.grad# print(f'{iter}: {theta}, {theta.grad}')recent.append(theta.grad.item())if all(map(lambda x: abs(x) < 1, recent)):breaktheta.grad.zero_()return theta.item()if __name__ == '__main__':data = gen_coins(0.6, n=200)num_head = (data.detach() == 1).sum().item()num_tail = (data.detach() == 0).sum().item()print(num_head, num_tail)print(train(num_head, num_tail))

有一点需要说明的是,在迭代过程中,我们保存最后三个导数的值,当最新的三个导数都很小时就退出迭代。

if all(map(lambda x: abs(x) < 1, recent))

运行代码,能发现最大化对数似然函数能很稳定的找到




现在大家对于伯努利MLE有了一定了解,接着,我们来思考一下最大化似然函数方法是否随着观察次数的增多能不断逼近真实的







呢?

MLE




估计的收敛性











 的情况下,我们来这样做试验,第一次做 n=1生成观察数据









,第二次做 n=2生成观察数据




































对于每个数据集







通过最大似然方法求得估计的









将这些












画出来,可以看到,随着


























换一个角度来看一下,我们将












数列按照顺序,离散化后再归一化比例,如下图画出来,红色的柱代表了最新的值









。可以发现,初始时候,









在较远离 0.7 的地方出现,随着 n 的增大,出现的位置比较接近 0.7。

但是不是所有 MLE 的结果都有无限接近目标参数的性质呢?这个悬念卖个关子留到后续的篇幅来揭示。

MLE




估计的偏差和方差

我们已经知道 MLE 方法可以通过观察数据推测出最有可能的









,由于观察数据




是伯努利过程产生的,具有随机性,那么









可以看成是







的随机变量。我们通过上面的试验知道随着试验次数的增大,我们的估计会越来越逼近真实值,现在的问题是对于固定的n









的方差是多少,它的均值是否是无偏的呢?

带着这样的疑问,我们现在做如下试验:

固定 n=10,重复做实验,画出随着次数增多









的分布,见图中绿色部分。同样的,红色是 n=80 不断试验的分布变化。

看的出来,随着试验次数的增多




























  • 都趋近于正态分布
















  • 的分散度比














    要大,即方差要大




























  • 的均值都在 0.7

好了,本篇就到这里,更多深入的可视化概念以及MLE和其他概念的联系,敬请后续篇幅为您呈现。


往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑温州大学《机器学习课程》视频
本站qq群851320808,加入微信群请扫码:

【机器学习基础】深入理解极大似然估计(MLE) 1: 引入问题相关推荐

  1. 机器学习强基计划4-2:通俗理解极大似然估计和极大后验估计+实例分析

    目录 0 写在前面 1 从一个例子出发 2 极大似然估计 3 极大后验估计 4 Python实现 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用."深" ...

  2. 机器学习基础:理解梯度下降本质「附Python代码」

    https://www.toutiao.com/a6646958932096975373/ 2019-01-16 13:15:26 今天我们尝试用最简单的方式来理解梯度下降,在之后我们会尝试理解更复杂 ...

  3. python机器学习案例系列教程——极大似然估计、EM算法

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 极大似然 极大似然(Maximum Likelihood)估计为用于已知模型的参数估计的统计学方法. 也就是求使得似然函数最大的代估参 ...

  4. 理解极大似然估计与最大后验概率估计

    文章目录 概率和统计 贝叶斯公式 似然函数 最大似然估计 最大后验概率估计 最大似然估计和最大后验概率估计的区别 最大似然估计的一个例子 参考链接 概率和统计 概率(probabilty)和统计(st ...

  5. 【机器学习基础】理解关联规则算法

    ‍‍ 一.基础概念 1.算法概述 关联规则挖掘可以让我们从数据集中发现项与项(item 与 item)之间的关系,它在我们的生活中有很多应用场景,"购物篮分析"就是一个常见的场景, ...

  6. 【机器学习基础】理解为什么机器可以学习1——PAC学习模型

    引言 自从下定决心认真学习机器学习理论开始,接触到很多基本问题,但其实都不是很理解,比如损失函数.风险函数.经验结构最小化.结构风险最小化.学习方法的泛化能力.VC维等,这些概念在学习中都纯属空泛的概 ...

  7. 【For非数学专业】通俗理解似然函数、概率、极大似然估计和对数似然

    文章目录 1. 似然函数与概率 1.1 似然函数与概率的初步认识 1.2 似然的定义 1.3 结合具体实例来深入理解似然与概率 2. 极大似然估计 3. 对数似然函数 4. 总结 1. 似然函数与概率 ...

  8. 极大似然估计的理解 为什么要取似然函数最大值 似然函数的意义是什么?

    对极大似然估计的理解 极大似然估计的形式: 1.离散型统计模型 表示观测值. 2.连续型统计模型 问题:问什么要取似然函数最大值来估算参数θ? 自己的理解: 似然函数的形式是理论上各事件(这个事件表示 ...

  9. 极大似然估计原理思想

    本文转自:  http://blog.csdn.net/poi7777/article/details/23204789 在机器学习的领域内,极大似然估计是最常见的参数估计的方法之一,在这里整理一 ...

最新文章

  1. 如何破除“唯论文”?详解伯克利“科研重工业模式”的成功经验
  2. 很牛逼的短链接,我们一起来晒晒短链接程序(转)
  3. PyCharm中目录directory与包package的区别
  4. mysql的show profile使用总结
  5. java 文件流关闭 finally,关于java:为什么需要在“ finally”内关闭文件,而仍将其嵌入在“ try / catch”块内?...
  6. 如何在Android Studio里关掉instant run
  7. 关于dev无法更新、调试的问题
  8. es内嵌文档查询_ElasticSearch 文档的增删改查都不会?
  9. 7-3 方格取数 (15 分)
  10. String的startWith()和endWith()
  11. C#使用SQLServer2016
  12. 一线数据分析师教你如何写简历才能脱颖而出!
  13. 激活码和注册码有什么不同?
  14. html中的圆圈链接,html – 如何在svg圈内添加链接
  15. JavaScript 对象 — 重学 JavaScript
  16. 01 APP被苹果APPStore拒绝的各种原因
  17. AWE2021:加速拥抱数字化 开启智慧生活新纪元
  18. Boolean初始值是什么?
  19. 北京房租大涨?6个维度,数万条数据帮你揭穿(附详情代码)
  20. 百度语音合成Rest API使用

热门文章

  1. Keil C 里面Lib库文件的生成与调用
  2. 360急速浏览器JS的调试
  3. rank() over,dense_rank(),row_number() 的区别
  4. Obj文件和Bin文件
  5. Android架构分析之Android消息处理机制(一)
  6. 访问者(Visitor)模式
  7. java中日期类型与字符串相互转换
  8. 原核表达常见问题解答
  9. pmp思维导图 第六版_《每天一小时,两月过PMP》备考指南(附计划表)
  10. simulink中from与goto模块的使用