最大似然估计MLE全攻略:从数学原理到工程实践

发布时间:2026/10/16 0:54:58
最大似然估计MLE全攻略:从数学原理到工程实践 1. 先从一次“猜箱子”说起最大似然估计到底在做什么我赌你第一次接触最大似然估计的时候跟我一样盯着教材上那一串连乘公式发呆——L(θ)∏P(xᵢ|θ)看着看着就困了。后来我换了个角度理解它一下就通了最大似然估计的整个逻辑其实就藏在一个“猜箱子”的游戏里。假设你面前有两个箱子A箱里有90个白球10个黑球B箱里有10个白球90个黑球。你闭着眼睛摸了一次摸出来一个白球。现在问题来了你更倾向于认为这个白球是从哪个箱子里摸出来的答案是A箱因为A箱摸出白球的概率是0.9B箱只有0.1。如果我再让你摸一次又摸出一个白球你几乎可以拍胸脯说就是A箱——两次都摸出白球的概率A箱是0.81B箱是0.01差距已经非常悬殊了。这个朴素得不能再朴素的推理过程就是最大似然估计的核心思想选定一组参数使得“当前已经观测到的数据”出现的概率最大。哪个参数让数据出现的概率最高我就信哪个参数。就这么简单。往专业了说最大似然估计Maximum Likelihood Estimation缩写MLE是一种参数估计方法。我们在做统计建模时往往会假设数据服从某个已知形式的分布比如正态分布、泊松分布、指数分布但分布里的参数是未知的。MLE的任务就是根据手里已有的样本观测值反过来推断最合理的参数取值是多少。这个“反过来推断”的过程在统计学里叫“逆概率”问题而MLE就是解决这类问题最经典、最主流的工具之一。我刚工作那会儿第一次在真实项目里用MLE是做用户行为数据的时长分布拟合。当时需要估计一个指数分布的速率参数λ用来预测用户在某页面停留时间的概率分布。一开始我真是硬套公式把似然函数写出来、取对数、求导、令导数为零、解出参数步骤全对但心里始终没底——为什么要取对数为什么导数为零就能找到最大值后来把这些“为什么”一个个想透了才算是真正会用了。这篇文章把我的理解整理出来希望能帮你少走我当年走过的弯路。这篇文章适合这几类人看正在学概率统计或机器学习的同学面试前需要快速搞懂MLE原理的求职者以及在实际工作中需要用MLE做参数估计、但不想只停留在“调包”层面的从业者。我会从数学原理讲到实际计算再讲到我踩过的坑尽量做到既能让新手听懂也让老手有收获。2. 为什么偏偏是“最大似然”而不是“矩估计”或“贝叶斯估计”学MLE的时候很多人会有一个困惑参数估计方法有好几种为什么最大似然估计能成为最主流的选择它到底比其他方法强在哪里要回答这个问题得先看看它的竞争对手们。先说矩估计。矩估计的思路是“样本矩等于总体矩”比如说正态分布有两个参数μ和σ²那我就用样本均值去估计μ用样本方差去估计σ²因为样本均值的期望就是μ样本方差的期望就是σ²。这个方法的优点是计算简单甚至不用知道分布的具体形式只要知道一阶矩和二阶矩就够了。但缺点也很明显它只用了样本的一阶矩和二阶矩信息样本里的其他信息全被浪费了。而且当分布比较复杂时矩估计的结果往往不是最精确的。举个极端例子如果数据里有几个异常大的离群值样本均值会被拉得很偏矩估计的参数也跟着失真。再说贝叶斯估计。贝叶斯估计的思路完全不同它在MLE的基础上引入了“先验分布”把参数也当作随机变量结合先验信息和观测数据得到“后验分布”。这个方法在理论上非常优雅当先验信息可靠时估计结果通常会比MLE更好尤其是在小样本场景下先验可以起到“正则化”的作用防止参数跑到不合理的范围里去。但问题在于先验怎么选选了不同的先验结果可能差很多。如果你对问题领域不熟瞎选先验还不如不选先验。此外贝叶斯估计通常需要计算后验分布很多情况下没有解析解得靠MCMC之类的数值采样方法计算成本比MLE高一个量级。MLE正好站在两者之间。它不引入先验完全“让数据说话”避免了主观性它又比矩估计更充分地利用了数据信息——它基于的是整个样本的联合概率分布而不是仅仅一阶矩二阶矩。在样本量足够大的情况下MLE有一系列非常漂亮的统计性质一致性样本量越大估计值越接近真实值、渐近正态性大样本下估计量的分布近似正态、渐近有效性在所有一致估计量中它的渐近方差最小。这些性质让MLE成为统计推断的“默认选择”。拿一个我实际处理过的案例来说明。我之前做过一个电商场景的客单价分布拟合数据明显右偏用对数正态分布建模比较合适。这时候用矩估计我只需要算样本的均值和方差然后反推对数正态的两个参数μ和σ计算确实快。但问题来了数据里有几个大促期间的极端高客单价记录直接导致样本均值虚高矩估计的μ和σ出现了明显偏差拟合出来的分布和实际数据形态差得很远。换成MLE重新估计之后虽然在计算上多花了一点时间但对数似然函数对这些离群值的惩罚机制是自然的不会因为少数极端值就产生破坏性影响拟合效果肉眼可见地好了。当然MLE也有自己的短板。它依赖你对分布形式的假设如果你假设错了比如明明是双峰分布你偏假设成单峰正态MLE照样给你一个“在错误假设下最优”的结果这就是所谓的“模型错误设定”风险。另外在小样本场景下MLE容易过拟合估计结果可能偏激。这些限制我们在实际使用的时候要心里有数。3. 似然函数与对数似然为什么必须取对数以及“负号”的来历MLE的数学过程看起来很简单写出似然函数对参数求导令导数为零解出参数。但每一步背后都有讲究我把关键环节拆开讲。3.1 似然函数和概率函数到底差在哪教科书上常说“似然函数和概率函数在形式上是一样的但视角不同”。这句话当年让我迷糊了很久因为从公式上看P(x|θ)就是P(x|θ)能有什么区别区别在于概率函数是已知参数θ描述数据x出现的可能性似然函数是已知数据x评估不同参数θ下这组数据出现的可能性。打个比方概率函数是“我已经知道硬币的偏斜程度问投出正面的概率是多少”似然函数是“我已经看到投了10次出了8次正面问这枚硬币偏斜到何种程度才最可能产生这个结果”。同一个数学表达式一个把θ当已知一个把x当已知这就是视角的转换。写公式的时候更准确地说似然函数通常写作L(θ|x)强调θ是变量x是给定的观测值。3.2 为什么要把连乘变成连加假设我们有n个独立同分布的样本x₁, x₂, ..., xₙ它们来自某个概率密度函数f(x|θ)那么这组样本的联合密度就是每个样本密度的乘积L(θ) ∏ᵢ₌₁ⁿ f(xᵢ|θ)理论上我们直接最大化这个乘积就行。但实际计算中会碰到两个大问题第一个问题是数值下溢。n稍微大一点比如几百个样本每个f(xᵢ|θ)都在0到1之间几百个小于1的数相乘结果会以指数级缩小。在计算机浮点数体系里这个乘积很快就变成0了连个影都留不下。第二个问题是求导不便。乘积的导数要用乘法法则n个函数相乘的导数展开之后是n项相加每一项都是一长串乘积式子复杂到没法看手工推导几乎不可能。对数函数是单调递增函数所以log(L(θ))和L(θ)在同一个θ处取得最大值——这是整个取对数操作的理论基石。取完对数之后乘法变成加法log L(θ) Σᵢ₌₁ⁿ log f(xᵢ|θ)数值下溢问题解决了加法不会让结果小到溢出求导问题也简单了对数函数求导比乘积求导友好太多一举两得。这就是为什么所有MLE的实际计算都在对数空间进行。3.3 “负对数似然”的来历最小化与最大化的等价做机器学习的朋友应该对“负对数似然”这个词不陌生PyTorch里的CrossEntropyLoss本质上就是在最小化负对数似然。为什么要把最大化问题变成最小化问题纯粹是工程习惯。绝大多数优化算法梯度下降、L-BFGS等都是为“最小化”设计的你让它们去找最小值比找最大值容易得多。既然min(-log L(θ))和max(log L(θ))等价那干脆加个负号把问题统一成最小化。我早期写代码时一直不理解为什么损失函数前面带个负号还以为是数学上有什么特别的讲究后来才明白没有玄学就是懒为了让优化器好干活。3.4 从求导到求解以正态分布为例手推一遍理论说了半天不如亲手推一遍印象深刻。我以最常用的正态分布为例假设样本x₁, x₂, ..., xₙ独立同分布于N(μ, σ²)我们要估计μ和σ²。正态分布的概率密度函数是f(x|μ, σ²) (1 / √(2πσ²)) · exp(-(x-μ)² / (2σ²))写出对数似然函数log L(μ, σ²) Σᵢ₌₁ⁿ [-1/2 · log(2πσ²) - (xᵢ-μ)² / (2σ²)]展开一下log L(μ, σ²) -n/2 · log(2π) - n/2 · log(σ²) - (1/(2σ²)) · Σᵢ₌₁ⁿ (xᵢ-μ)²先对μ求偏导令其为零∂logL/∂μ (1/σ²) · Σᵢ₌₁ⁿ (xᵢ-μ) 0解得μ̂ (1/n) · Σᵢ₌₁ⁿ xᵢ x̄也就是说正态分布均值参数μ的极大似然估计就是样本均值。这个结果很直观数据聚类中心在哪μ就在哪。再对σ²求偏导令其为零。这里我提醒一下对σ²求导时要把它看成一个整体变量不要分步去求否则容易乱。过程如下∂logL/∂σ² -n/(2σ²) (1/(2σ⁴)) · Σᵢ₌₁ⁿ (xᵢ-μ)² 0整理得σ̂² (1/n) · Σᵢ₌₁ⁿ (xᵢ-μ̂)²注意这里的分母是n不是n-1。这意味着MLE给出的方差估计是有偏的——它用的是n做分母而经典的无偏估计量用的是n-1。样本量小的时候MLE的方差估计会系统性地低估真实方差。这一点在实际使用中要特别注意。好在样本量一大n和n-1的差别可以忽略不计但在小样本场景下如果你需要用方差做推断建议把MLE的结果修正一下乘以n/(n-1)。4. 从解析解到数值解真实世界里的MLE是怎么计算出来的手动推导正态分布的MLE很爽因为能求出解析解一个公式直接算出来。但真实世界里的分布大多没有这么温柔。比如逻辑回归的似然函数或者更复杂的混合模型求导之后得到的方程组往往没有闭式解必须靠数值优化的方法迭代求解。这块内容很多教程不太讲但实际工程里避不开我单独开一节说说。4.1 什么时候能写出解析解什么时候必须走数值优化简单的判断标准是如果对数似然函数关于参数是二次形式比如正态分布对μ求导之后是线性方程那就能直接解出参数。反过来如果对数似然函数是参数的复杂非线性函数比如逻辑回归里的sigmoid函数套在参数里求导之后是超越方程没有解析解只能迭代。我整理一个常见分布MLE求解方式的对照表供你快速参考分布待估参数求解方式说明正态分布μ, σ²解析解μ̂样本均值σ̂²(1/n)Σ(xᵢ-μ̂)²泊松分布λ解析解λ̂样本均值因为泊松分布期望就是λ指数分布λ解析解λ̂1/样本均值注意是倒数关系伯努利分布p解析解p̂样本中事件发生的频率逻辑回归回归系数β数值解梯度下降/牛顿法迭代正态混合模型各组μ, σ, 权重数值解通常用EM算法直接迭代容易陷入局部最优Weibull分布形状参数k, 尺度参数λ数值解形状参数k的方程是超越方程只能数值求解我在实际项目中最常遇到的两类情况一类是数据服从已知的简单分布直接用解析解套公式快得很另一类是逻辑回归或神经网络这类模型似然函数没有解析解必须走优化算法。后者的计算过程里有一个我在实战中反复踩坑的细节梯度的计算一定要自己验证一下不要盲信推导结果。4.2 牛顿法和梯度下降法在MLE里的实际应用数值求解MLE最朴素的方法是梯度上升既然我们要最大化对数似然。每一步让参数沿着梯度方向走一小步θ_new θ_old η · ∇logL(θ)这里η是学习率也叫步长。步长太小收敛慢步长太大容易震荡甚至发散。我刚开始调参时吃过步长太大的亏——损失函数一路狂飙直接溢出成NaN。后来经验是先设一个比较小的步长观察几次迭代的损失变化趋势如果每一步都在下降对于负对数似然来说可以尝试逐渐加大步长加快收敛。如果追求更快的收敛速度牛顿法是个好选择。牛顿法不仅用一阶导梯度还用二阶导Hessian矩阵相当于考虑了损失函数曲率信息在接近最优解时收敛非常快。它的迭代公式是θ_new θ_old - H⁻¹ · ∇logL(θ)其中H是Hessian矩阵。但牛顿法的代价也很明显Hessian矩阵的计算和求逆在参数维度高的时候开销巨大n×n的矩阵求逆是O(n³)复杂度参数一多就扛不住。所以实际工程里大家更常用的是拟牛顿法比如L-BFGS它用梯度的历史信息近似Hessian既保留了牛顿法收敛快的优点又避开了显式计算Hessian的高昂成本。我个人的建议是如果你的问题是中小规模参数不超过几千直接上L-BFGS如果是深度模型这种大规模问题用SGD或Adam。在统计推断场景下L-BFGS往往比SGD更适合——它不需要调学习率收敛稳定而且能直接给出比较精确的最优解。我自己在R里做glm拟合时底层用的就是IRLS迭代加权最小二乘本质上也和牛顿法同源。4.3 一个完整的小例子手写逻辑回归的MLE求解我拿逻辑回归举个例子帮你串一遍数值求解MLE的完整流程。逻辑回归假设P(y1|x) 1 / (1 exp(-wᵀx))我们的目标是找到一组权重w使得训练数据的对数似然最大。单个样本的对数似然贡献是log P(yᵢ|xᵢ, w) yᵢ · log σ(wᵀxᵢ) (1-yᵢ) · log(1-σ(wᵀxᵢ))整个训练集的对数似然就是每个样本贡献之和。接下来求梯度∇logL(w) Σᵢ (yᵢ - σ(wᵀxᵢ)) · xᵢ这个式子太漂亮了——误差项真实值减预测概率乘以特征向量然后求和。这种形式在广义线性模型里很常见背后有深刻的统计原理但这里不展开。有了梯度就可以用梯度上升迭代求解。我在实际写代码时会在每个epoch打印一次负对数似然值确认它是在单调下降的。有一回我发现损失在迭代到第50轮左右突然不再下降卡住了怎么调学习率都过不去。后来检查发现是某个特征没有做标准化取值量级比其他特征大好几个数量级导致梯度方向严重偏向那个特征优化过程变得极其缓慢。把所有特征标准化减去均值、除以标准差之后同样的迭代设置损失在20轮内就收敛了。这种“看起来玄学”的问题根源就是特征量纲不统一血的教训。5. 四个坑与一个彩蛋我的MLE实战经验总结这几节重点说说我实际使用MLE时踩过的坑以及我是怎么排查解决的。这些东西教科书上不写但真的能救命。5.1 坑一数值下溢你的“似然”直接归零前面提到过连乘会导致数值下溢取对数能解决这个问题。但有些场景下即使取了对数还是会撞上下溢。比如一个数据的概率密度极其小log之后是一个非常大的负数比如-10000几个加起来负对数似然直接爆掉。我遇到过一次最极端的情况是在拟合一个高维正态分布时涉及协方差矩阵的行列式计算。行列式值小到浮点数精度之外导致整个似然函数变成非法值。排查了半天最后用Log-Determinant技巧直接在对数域计算行列式的对数才解决。经验总结在涉及MLE的代码里尽量全程在对数域操作中间过程如果必须回到原始概率空间一定要检查结果是否有下溢风险。在Python里可以用scipy.special.logsumexp这个函数专门解决对数域加法问题数值稳定性比直接exp之后再加要好得多。5.2 坑二多峰似然函数你找到的“最大”可能不是真的最大很多似然函数不是单峰的尤其是混合模型或者包含隐变量的模型。梯度上升从不同的初始点出发可能收敛到不同的局部最优值。我调试高斯混合模型时用K-means的结果初始化参数通常能得到不错的解但如果随机初始化偶尔会收敛到一个很差的局部最优。经验总结多跑几次不同的初始值选负对数似然最小的那组参数。这也是为什么scikit-learn里的GaussianMixture模型有个n_init参数默认就是10意思是跑10次不同的初始化保留最优结果。不是老外闲得慌是真的有必要。还有一个实战技巧检查Hessian矩阵是否正定。在最优解附近Hessian应该是正定的所有特征值为正如果不是说明你可能根本没收敛到极大值点而是卡在了鞍点上。不过手算Hessian太费劲我现在基本靠一个经验判断查看迭代结束时梯度范数是否足够小比如小于1e-6如果梯度还很大那一定没收敛好换个初始点再跑。5.3 坑三分布假设错了MLE再努力也是白搭这是MLE最隐蔽的一个坑。MLE只会帮你找到“在你假设的分布族内最合适的参数”它不会告诉你“你假设的分布族本身就不对”。如果你拿单峰正态去拟合一个双峰数据MLE给出的μ和σ²虽然能让正态分布的似然最大但这个正态分布和真实数据的形态差了十万八千里。怎么规避我通常的做法是先用可视化工具粗略看一下数据分布形态。画个直方图看一眼是单峰还是多峰是左偏还是右偏心里大概有个谱再决定用哪个分布族。有时候我也会同时拟合两三个候选分布然后用AIC或BIC做比较——这两个指标都在似然值的基础上加了参数数量的惩罚项能在不同模型之间做公平比较。选AIC或BIC最小的那个模型。这一套流程走下来基本能避免“假设错误”这个坑。5.4 坑四小样本场景下MLE的过拟合与有偏性问题我前面提到过MLE在样本量小的时候方差估计会有偏分母n导致的低估而且整个估计结果容易过拟合。比如你用10个样本估计一个10参数的模型MLE可以完美拟合所有样本点但这这个结果毫无泛化能力。这条经验的实操含义是如果样本量相对于参数数量不够充裕考虑加正则化相当于贝叶斯先验或者换用其他估计方法。我处理小样本问题时的经验是如果样本量小于参数数量的10倍MLE结果就要打问号了至少要结合交叉验证来评估稳定性。5.5 彩蛋把MLE和损失函数家族联系起来最后一个经验也是我认为最有价值的认知升级MLE其实是一整个损失函数家族的源头。回归问题里用平方损失MSE对应的是假设误差服从正态分布时的MLE分类问题里用交叉熵损失对应的是假设输出服从伯努利分布多分类就是多项分布时的MLE计数问题里可能用到Poisson损失对应的是假设数据服从泊松分布的MLE。所以你会发现深度学习里很多看似“设计出来”的损失函数其实都是从概率假设出发、用MLE框架自然推导出来的。理解了这层关系下次你在面试或实际项目中被人问到“为什么分类用交叉熵、回归用均方误差”你可以从MLE的视角给出一个特别有说服力的解释因为它们在各自的概率假设下是“最大似然”的天然产物。我个人在实际操作中的体会是MLE真正难的地方不在数学推导而在于建模时的每个选择——选什么分布、怎么处理数值问题、怎么判断收敛——这些都需要实际踩坑才能积累感觉。建议你找个真实数据集哪怕是自己造的数据把逻辑回归的MLE从零手写一遍不用任何机器学习库就用梯度上升迭代硬解。跑通了之后你对MLE的理解会有一个质的飞跃。这个练习我到现在还给团队里的新同学布置反馈都说收获比读十遍教材都大。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询