【初中生讲机器学习】12. 似然函数和极大似然估计:原理、应用与代码实现

本文主要是介绍【初中生讲机器学习】12. 似然函数和极大似然估计:原理、应用与代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

创建时间:2024-02-23
最后编辑时间:2024-02-24
作者:Geeker_LStar

你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~
我是 Geeker_LStar,一名初三学生,热爱计算机和数学,我们一起加油~!
⭐(●’◡’●) ⭐
那就让我们开始吧!

在上一篇 【初中生讲机器学习】11. 回归算法中常用的模型评价指标有哪些?here! 中,我说我要单开一篇讲讲 “似然”。诺,这不就来了嘛~!
在机器学习里,似然是个蛮重要的概念,但也的确不太好理解,我们来看看吧~

文章目录

  • 似然和概率
  • 似然函数
    • 数学推导
    • 一个例子
    • 代码实现
  • 极大似然估计
    • 数学推导
    • 代码实现

似然和概率

嗯,提到 “似然(likelihood)”,那就不得不说说它的好基友 “概率(probability)” 了。这俩经常被混为一谈(甚至某些教科书都这么写),但实际上,至少在统计学和机器学习里,它俩的区别还是很大的。

从一个简单但经典的例子入手:

概率:
有一个箱子,装有除颜色外都相同的黑色球和白色球共 100 个,其中黑色球有 90 个,白色球 10 个,现在从箱子中任取一个球,结果是黑色球的概率?

这个很简单,90/100*100% = 90% 嘛,这个球是黑球的概率就是 90% 了。
从这个例子可以看出,“概率” 是什么,就是在你已经知道了前提条件(球的总数和颜色分布)的时候,计算某一种特定情况(黑球)出现的可能性。
专业一点,“概率” 是针对概率空间中的某一个事件而言的。

再来看似然。

似然:
有一个箱子,装有除颜色外都相同的黑色球和白色球共 100 个,其中一种颜色的球 90 个,另一种颜色的球 10 个。现在从箱子中任取一球,结果是黑色球,则箱中黑色球是 90 个可能性是多少?

先不说具体怎么计算,但至少从直觉上来讲,你应该会觉得 “黑色球是 90 个的可能性” 大于 “白色球是 90 个的可能性”。因为你这次摸出的是黑色球,而人们总是会倾向于认为 “已经发生的事情发生的概率大”。就比如,如果你再摸几个(摸完放回去),发现一连摸出了 10 个白色球,那或许就会认为黑色球是 10 个,而白色球是 90 个了。ok 不过这个等到极大似然估计那里再细说。

这个例子想要说明什么呢?yes,似然和概率的差别就在于,“似然” 是对于参数而言的(比如球的总数和颜色分布),它可以大致概括为 “在当前结果(现象)出现的情况下,参数是某种情况的可能性”。
概率和似然的关系,类似贝叶斯那篇中讲过的条件概率 P ( A ∣ B ) P(A|B) P(AB) 和后验概率 P ( B ∣ A ) P(B|A) P(BA) 之间的关系。概率是从参数(条件)推到现象(结果),似然是从现象(结果)推到参数(条件)。

从这里再延伸一点,讲一下似然函数和概率密度函数(或概率质量函数)的区别与联系
简单讲一下概率密度(质量)函数:如果一个变量是离散的,它取不同值时的概率是一个个点而不是一条连续的曲线,那么就称它的概率函数为概率质量函数;而如果这个变量是连续的,即它取不同值时的概率能够组成一条连续的曲线,那么就称它的概率函数为概率密度函数,一个典型的概率密度函数(正态分布)如下图:

正态分布

虽然我们还没有讲似然函数,但是从似然和概率在定义上的不同也可以猜到一二:似然函数的自变量是参数,概率密度(质量)函数的自变量是现象(结果)。似然函数告诉我们,在现象(结果)已知的情况下,参数取值为某种情况的可能性是多少,而概率密度(质量)函数告诉我们,在参数已知的情况下,某种现象(结果)出现的可能性是多少。
它们两个正好反过来。

似然函数

好,热身完毕,我们现在来看看似然函数到底是什么。

数学推导

先上数学定义,后面详细推:
L ( θ ∣ x ) = P ( x ∣ θ ) L(\theta|x) = P(x|\theta) L(θx)=P(xθ)其中, L ( θ ∣ x ) L(\theta|x) L(θx) 是似然函数, P ( x ∣ θ ) P(x|\theta) P(xθ) 是在条件(参数) θ \theta θ 下, x x x 发生的概率。
来推导一下,和贝叶斯那篇的推导很相似。为了方便,我们把参数定义为 B,现象定义为 A。那么我们要求的似然函数就是: L ( B ∣ A ) = P ( B ∣ A ) = P ( A , B ) P ( A ) = P ( A ∣ B ) P ( B ) P ( A ) L(B|A) = P(B|A) = \frac{P(A, B)}{P(A)} = \frac{P(A|B)P(B)}{P(A)} L(BA)=P(BA)=P(A)P(A,B)=P(A)P(AB)P(B)

嘿嘿嘿是不是和贝叶斯那个很像~
我们知道,事件 A 已经发生了(我们之前说过,“似然” 表示某个现象(结果)产生时,参数是某种情况的可能性),所以 P ( A ) P(A) P(A) 直接等于 1 了,so 和朴素贝叶斯一样,现在又变成联合概率的事情了,即 P ( B ∣ A ) = P ( A ∣ B ) P ( B ) P(B|A) = P(A|B)P(B) P(BA)=P(AB)P(B).

好,再继续往下之前,我们需要明确一件事——计算似然函数的目的并不是要知道这个值到底是多少,似然函数本身的数值没什么意义,重要的是比较不同参数的似然函数大小,似然函数最大的那个参数就是最符合当前现象(结果)的参数。

知道这一点之后再去看之前的式子,我们不用管 P ( A ∣ B ) P ( B ) P(A|B)P(B) P(AB)P(B) 到底是多少,我们只需要得到使得 P ( A ∣ B ) P ( B ) P(A|B)P(B) P(AB)P(B) 最大的 A A A 值就可以。所以, P ( B ) P(B) P(B) 是多少不重要,直接忽略它就好。

so 最后得到的结果就是 L ( θ ∣ x ) = P ( x ∣ θ ) L(\theta|x) = P(x|\theta) L(θx)=P(xθ),不过我们可以做进一步的展开
分两种情况,x,注意不是参数 θ 而是 x,是离散型还是连续型(不过本质上没什么区别)。
先说连续型吧,在概率和贝叶斯的那篇中我讲过,假设各个参数彼此独立,那么有:
L ( θ ∣ x ) = P ( x ∣ θ ) = f ( x 1 , x 2 , . . . , x n ∣ θ ) = ∏ i = 1 n f ( x i ∣ θ ) L(\theta|x) = P(x|\theta) = f(x_1, x_2, ... , x_n|\theta) = \prod \limits_{i=1}^nf(x_i|\theta) L(θx)=P(xθ)=f(x1,x2,...,xnθ)=i=1nf(xiθ)这坨东西在数值上等于各个观测值 x 的概率密度函数值的乘积但是,需要明确的是,虽然似然函数和概率密度函数在形式上一致,但是它们并不等价(意思同 “函数的等价”)。 概率密度函数的自变量是观测值,而似然函数的自变量是参数它描述的是在给定结果的条件下参数出现的可能性。

离散型的也好办,公式就是 ∏ i = 1 n P ( x i ∣ θ ) \prod \limits_{i=1}^nP(x_i|\theta) i=1nP(xiθ),在形式上和概率质量函数等价。

一个例子

用一个抛硬币的例子来理解上面讲的那些。

有一枚硬币,抛出后正面朝上的概率为 P,反面朝上的概率为 1-P。现在抛这种硬币 10 次,共有 6 次正面朝上,问 P 的值最有可能是多少?

显然,这是一个关于似然的问题,思路大致如下:

  1. 计算不同 P 值的似然度,即在当前结果的条件下,不同 P 值的可能性。
  2. 似然度最大的 P 值,即最有可能的 P 值。

顺着这个思路来算一下,记硬币正面向上为 H:
第一种情况,P=0.5,也就是硬币正反面朝上的概率相等(经典情况,均匀的硬币),我们要求 L ( 0.5 ∣ 6 H ) L(0.5|6H) L(0.5∣6H),根据 L ( θ ∣ x ) = P ( x ∣ θ ) L(\theta|x) = P(x|\theta) L(θx)=P(xθ),我们只需计算 P ( 6 H ∣ 0.5 ) P(6H|0.5) P(6H∣0.5)即在 P=0.5 的时候,10 次中有 6 次正面朝上的概率

嗯,典型的二项分布(之前说过,关于各种分布会单独开一篇讲),二项分布的公式: l i k e l i h o o d ( X = k ) = C n k P k ( 1 − P ) n − k likelihood(X=k) = C_{n}^{k}P^{k}(1-P)^{n-k} likelihood(X=k)=CnkPk(1P)nk其实如果学过排列组合的话应该还算好理解,前面的 C n k C_{n}^{k} Cnk 就是组合数,后面的 P k ( 1 − P ) n − k P^{k}(1-P)^{n-k} Pk(1P)nk 就是某一种符合要求的情况出现的概率。

先来算一下 P=0.5,其中 k = 6。 l i k e l i h o o d ( P = 0.5 ) = C 10 6 0. 5 6 0. 5 4 = 210 ∗ 0. 5 1 0 ≈ 0.20508 likelihood(P=0.5) = C_{10}^{6}0.5^{6}0.5^{4} = 210*0.5^10 ≈ 0.20508 likelihood(P=0.5)=C1060.560.54=2100.5100.20508,也就是说,在 “10 次中有 6 次正面朝上” 这个事件发生的条件下,“硬币正面朝上的概率 P 为 0.5” 的似然度是 0.2 左右。
注意,这不是说 “6 次正面朝上” 的概率是 0.2 左右,而是 “在 6 次正面朝上” 的结果下,P=0.5 的似然度(可能性)是 0.2,这两者并没有直接关系。
说过啦,这个数值本身不重要,重要的是和其它 P 值的似然度的比较

再来看看 P=0.6,公式 l i k e l i h o o d ( P = 0.6 ) = C 10 6 0. 6 6 0. 4 4 ≈ 0.25082 likelihood(P=0.6) = C_{10}^{6}0.6^{6}0.4^{4} ≈ 0.25082 likelihood(P=0.6)=C1060.660.440.25082,也就是说 “硬币正面朝上的概率 P 为 0.6” 的似然度是 0.25,高于 P=5 时,换言之,P=0.6 比 P=0.5 时更有可能出现当前结果

那么 P=0.7 呢?答案是 0.20012 左右,不如 P=0.6 的时候。并且根据二项分布的图像(后几篇里会讲),P=0.8、0.9 等等的时候,似然度只会继续降低。

代码实现

嗯,但是我们肯定不可能把所有的 P 值的情况都算一遍,so 代码 & 可视化走起:

# 似然函数——可视化
import numpy as np
import matplotlib.pyplot as plt
import math# 定义似然函数
# n:实验次数;k:成功次数;p:成功概率
def likelihood(n, k, p):# 组合数 * 一种符合要求的情况的概率return math.comb(n, k) * (p ** k) * ((1-p) ** (n-k))# 生成自变量(成功概率,也就是参数)的取值范围
x = np.linspace(0, 1, 100)
# 计算对应的因变量(似然)的取值
y = [likelihood(10, 6, i) for i in x]# 绘制曲线图
plt.plot(x, y)
plt.title('Likelihood Function')
plt.xlabel('P')
plt.ylabel('Likelihood')
plt.show()

x=\dfrac{-b\pm \sqrt{b^{2}-4ac}}{2a}.

结果图如下,红线是似然函数值最大的参数,大概在 0.6 左右。也就是说,在当前结果下,“P = 0.6” 是最有可能的参数,它最能解释当前的结果。

似然函数

图应该就清晰多了。总而言之,关于似然函数,下面这些是重点:
似然函数的自变量是参数,它衡量的是在某种结果下某种参数的合理性(或这种参数出现的可能性)。似然函数本身的值并不重要,重要的是哪种参数的似然函数最大。一般而言,似然函数最大的参数对模型的解释性最强。

极大似然估计

好,终于把似然和似然函数讲完了(我感觉讲的挺明白的),接下来来看一个重要的应用——极大似然估计。

极大似然估计,英文全称 Maximum Likelihood Estimation,简称 MLE。

一句话概括核心思想:已经发生的事情发生的概率大。
好好好,这句话的确说的奇奇怪怪的,不过解释完你就懂了~
假设我们现在在训练一个模型,我们知道一堆样本 X = ( X 1 , X 2 , . . . , X n ) X=(X_1, X_2, ... , X_n) X=(X1,X2,...,Xn),它们的观测值分别为 x = ( x 1 , x 2 , . . . , x n ) x=(x_1, x_2, ..., x_n) x=(x1,x2,...,xn)(啊对我觉得还是规范一下书写比较好,,,要不然写着写着就乱了),我们的目标就是给这个模型找到参数。
那么,什么样的参数最好呢?这不用问了,我们肯定要求参数对训练集的解释性强,即参数可以让模型较好的拟合训练集,因为要是连训练集都拟合不好,还怎么泛化。所以,我们要选择似然函数值最大的那个(或那组)参数。这个过程就被称为极大似然估计。换言之,极大似然估计就是利用已知的样本及结果信息,反推最有可能让这些结果出现的模型参数值。

用数学表达就是:
θ = a r g m a x θ L ( X = x ∣ θ ) \theta = argmax\ {\theta} \ L(X=x|\theta) θ=argmax θ L(X=xθ)

数学推导

不用抛硬币的例子了,二项分布不如正态分布好理解,我们用正态分布来举例吧。
关于正态分布,在线性回归原理那一篇中有讲过,后面还会再开一篇讲分布,这里不再细说。
我们假设有一堆样本,其值服从正态分布(也就是说我们可以用一个正态曲线去拟合它们),我们要做的是找到这个正态曲线的平均值和标准差
换言之,我们要找到一组平均值和标准差,它们描述的正态曲线可以最好地拟合已知样本
怎么办?yesyes,极大似然估计嘛,我们让似然函数最大就 ok!

根据上一部分讲的公式,似然函数是:
L ( μ , σ 2 ∣ x ) = P ( x ∣ μ , σ 2 ) = f ( x 1 , x 2 , . . . , x n ∣ μ , σ 2 ) = ∏ i = 1 n f ( x i ∣ μ , σ 2 ) L(\mu, \sigma^2|x) = P(x|\mu, \sigma^2) = f(x_1, x_2, ... , x_n|\mu, \sigma^2) = \prod \limits_{i=1}^nf(x_i|\mu, \sigma^2) L(μ,σ2x)=P(xμ,σ2)=f(x1,x2,...,xnμ,σ2)=i=1nf(xiμ,σ2)再根据正态分布的概率密度函数,进一步得到:
l i k e l i h o o d = ∏ i = 1 n f ( x i ∣ μ , σ 2 ) = ∏ i = 1 n 1 2 π σ e − ( x i − μ ) 2 2 σ 2 likelihood = \prod \limits_{i=1}^nf(x_i|\mu, \sigma^2) =\prod \limits_{i=1}^n\frac{1}{\sqrt{2\pi}\sigma}{\rm e}^{-\frac{(x_i-\mu)^2}{2\sigma^2}} likelihood=i=1nf(xiμ,σ2)=i=1n2π σ1e2σ2(xiμ)2我们要求的就是等号最右边那个式子的最大值!

emm 不过,局势目前并不太好(),因为连乘算起来好麻烦。。。
好吧好吧,怎么把乘法变成加法呢?或许 log ⁡ a M + log ⁡ a N = log ⁡ a ( M + N ) \log_a M+\log_a N = \log_a (M+N) logaM+logaN=loga(M+N) 会给你一点启发——没错,我们可以在等式两边同时取对数呀!并且,让似然函数最大,和让似然函数的对数最大,是等价的。
插一句,通过取对数把连乘的式子转换为求和的形式,这种方法很常用。

有了 ln ⁡ \ln ln 的帮助(没错这叫对数似然函数),式子变成了下面这样:
ln ⁡ ( l i k e l i h o o d ) = ∑ i = 1 n ln ⁡ ( 1 σ 2 π e − ( x i − μ ) 2 2 σ 2 ) \ln(likelihood) = \sum^n_{i=1}\ln \left( \frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{(x_i-\mu)^2}{2\sigma^2}} \right) ln(likelihood)=i=1nln(σ2π 1e2σ2(xiμ)2)

进一步化简,得到 ln ⁡ ( l i k e l i h o o d ) = ∑ i = 1 n ln ⁡ 1 − ∑ i = 1 n ln ⁡ ( σ 2 π ) + ∑ i = 1 n ln ⁡ e − ( x i − μ ) 2 2 σ 2 \ln(likelihood) = \sum^n_{i=1}\ln 1 - \sum^n_{i=1}\ln(\sigma \sqrt{2\pi}) + \sum^n_{i=1}\ln e^{-\frac{(x_i-\mu)^2}{2\sigma^2}} ln(likelihood)=i=1nln1i=1nln(σ2π )+i=1nlne2σ2(xiμ)2

那么最终结果就是: ln ⁡ ( l i k e l i h o o d ) = − n ln ⁡ ( σ 2 π ) − ∑ i = 1 n ( x i − μ ) 2 2 σ 2 \ln(likelihood) = - n\ln(\sigma \sqrt{2\pi}) - \sum^n_{i=1}\frac{(x_i-\mu)^2}{2\sigma^2} ln(likelihood)=nln(σ2π )i=1n2σ2(xiμ)2

ok!我们现在只需要让这个式子取得最大值就完美了~!
嗯,怎么办,老方法,求偏导啊(((
先对平均值 μ \mu μ 求:
∂ ∂ μ ( − n ln ⁡ ( 2 π σ ) − ∑ i = 1 n ( x i − μ ) 2 2 σ 2 ) = ∑ i = 1 n 2 ( x i − μ ) 2 σ 2 = ∑ i = 1 n x i − μ σ 2 \frac{\partial}{\partial \mu} (-n\ln(\sqrt{2\pi}\sigma) - \sum_{i=1}^n \frac{(x_i-\mu)^2}{2\sigma^2}) \\ = \sum_{i=1}^n \frac{2(x_i-\mu)}{2\sigma^2} \ \\ = \sum_{i=1}^n \frac{x_i-\mu}{\sigma^2} μ(nln(2π σ)i=1n2σ2(xiμ)2)=i=1n2σ22(xiμ) =i=1nσ2xiμ

再对标准差 σ \sigma σ 求:
噗哈哈哈我当时求这个的时候,因为忘了 σ \sigma σ 在分母上,所以有两次求出来的偏导的分母中的 σ \sigma σ 的次数是 1 啊呃呃呃((()。
∂ ∂ σ ( − n ln ⁡ ( 2 π σ ) − ∑ i = 1 n ( x i − μ ) 2 2 σ 2 ) = − n σ + ∑ i = 1 n ( x i − μ ) 2 σ 3 \frac{\partial}{\partial \sigma} (-n\ln(\sqrt{2\pi}\sigma) - \sum_{i=1}^n \frac{(x_i-\mu)^2}{2\sigma^2}) \\ = -\frac{n}{\sigma} + \sum_{i=1}^n \frac{(x_i-\mu)^2}{\sigma^3} σ(nln(2π σ)i=1n2σ2(xiμ)2)=σn+i=1nσ3(xiμ)2

ok~!偏导不难,解出来结果如下:
{ ∂ ∂ μ = ∑ i = 1 n x i − μ σ 2 ∂ ∂ σ = − n σ + ∑ i = 1 n ( x i − μ ) 2 σ 3 \left\{\begin{matrix} \frac{\partial}{\partial \mu}= \sum_{i=1}^n \frac{x_i-\mu}{\sigma^2} \\ \frac{\partial}{\partial \sigma}= -\frac{n}{\sigma} + \sum_{i=1}^n \frac{(x_i-\mu)^2}{\sigma^3} \end{matrix}\right. {μ=i=1nσ2xiμσ=σn+i=1nσ3(xiμ)2

回到最开始的目的——求似然函数的最大值,嗯,那就让两个偏导都等于 0 就 ok 了~~(啊呃,其实这里可以用二阶偏导小于 0 来说明确实是最大值,不过我懒。。)
也就是:
{ ∑ i = 1 n x i − μ σ 2 = 0 − n σ + ∑ i = 1 n ( x i − μ ) 2 σ 3 = 0 \left\{\begin{matrix} \sum_{i=1}^n \frac{x_i-\mu}{\sigma^2} = 0 \\ -\frac{n}{\sigma} + \sum_{i=1}^n \frac{(x_i-\mu)^2}{\sigma^3} = 0 \end{matrix}\right. {i=1nσ2xiμ=0σn+i=1nσ3(xiμ)2=0

这两个很好解。
上面那个 μ \mu μ 就是 ∑ i = 1 n x i = ∑ i = 1 n μ \sum_{i=1}^n x_i = \sum_{i=1}^n \mu i=1nxi=i=1nμ,解出 μ = ∑ i = 1 n x i n \mu = \frac{\sum_{i=1}^n x_i}{n} μ=ni=1nxi,也就是说, μ \mu μ 的极大似然估计就是这堆样本的平均值
怎么说,你可能会想, μ \mu μ 这个东西本来不就是平均值吗?我又用极大似然估计给它解出来一遍是干什么,,,nonono, μ \mu μ 本身表示的是正态曲线的平均值,我们事先不知道正态曲线的平均值应该是多少的,但是用极大似然估计推出来它就等于目前这些样本的平均值,这正好反映了极大似然估计就是在 “把对当前结果拟合最优的参数选择为模型参数” 呀!

下面那个 σ \sigma σ 就是 n = ( x i − μ ) 2 σ 2 n = \frac{(x_i-\mu)^2}{\sigma^2} n=σ2(xiμ)2,解出来 σ = ( x i − μ ) 2 n \sigma = \sqrt{\frac{(x_i-\mu)^2}{n}} σ=n(xiμ)2 ,也就是这堆样本的标准差。

那么,如果不是正态分布,而是其它任意一种形式的数据(甚至有可能我们都不知道它是哪种形式的),比如后面会讲的逻辑回归,有没有一个 “通法” 呢?
当然是有的啦!

first,我们得知道这个数据集应该用什么算法去拟合(不知道就散点图看一下 or 多尝试几个),比如到底是线性回归(一元 or 多元?)还是逻辑回归?
second,每种算法都有一个带参数的式子,比如多元线性回归是 y = w 1 x 1 + w 2 x 2 + . . . + w n x n + b y = w_1x_1 + w_2x_2 + ... + w_nx_n + b y=w1x1+w2x2+...+wnxn+b,按照之前给的那个 L ( θ ∣ x ) = P ( x ∣ θ ) L(\theta|x) = P(x|\theta) L(θx)=P(xθ),把 P ( x ∣ θ ) P(x|\theta) P(xθ) 的表达式写出来,如果有需要再取个对数把连乘换成求和,如果还有需要也可以把最大化问题转化为负数最小化问题(负对数似然函数)。
third,求极值。方法很多,最常规的就是对求和函数中的每一个参数分别求偏导,令偏导等于 0,解得每一个参数的值。也可以用梯度下降法、牛顿法等方法。

不过,咳咳咳()()()一般有内置函数的()()不过如果哪天你心血来潮想训练一下自己求偏导的水平其实这也不失为一个好方法(((bushi)。

代码实现

我们用代码来实现一个正态分布曲线的极大似然估计。

import numpy as np
from scipy.stats import norm
from scipy.optimize import minimize# 生成一些正态分布的样本数据
np.random.seed(218)    # 随机种子
mu_true = 2.0    # 真实的均值
sigma_true = 1.5    # 真实的标准差
sample_size = 1000    # 样本数量
data = np.random.normal(mu_true, sigma_true, sample_size)# 极大似然估计的目标函数
def neg_log_likelihood(params, data):"""负对数似然函数,用于最小化参数:- params:包含均值和标准差的参数数组- data:观测到的样本数据返回:- 负对数似然函数的值"""mu, sigma = params  # 提取均值和标准差ll = -np.sum(norm.logpdf(data, loc=mu, scale=sigma))  # 计算负对数似然函数值return ll# 初始参数猜测值
initial_guess = [1.0, 1.0]    # 初始均值和标准差的猜测值
# 极大似然估计:使用 L-BFGS-B 方法最小化负对数似然函数
result = minimize(neg_log_likelihood, initial_guess, args=(data,), method='L-BFGS-B')
# 提取估计得到的均值和标准差
mu_mle, sigma_mle = result.x  # 提取估计的均值和标准差
# 打印结果
print("真实均值:", mu_true)
print("估计的均值:", mu_mle)
print("真实标准差:", sigma_true)
print("估计的标准差:", sigma_mle)

注释里面已经写的比较详细了,这里再来解释一下吧~
代码中的方法和我们推导的时候使用的方法有一点细微的差别(但在思想上是一样的),我在代码中计算的是负对数似然函数,因为它可以直接使用 numpy 库中的 L-BFGS-B 算法进行最小化。
L-BFGS-B 算法是优化算法的一种,类似的还有牛顿法等。
(插一句,numpy 这个库简直太 wonderful 了!!)

来看一下结果,极大似然估计的效果还是非常棒的!

结果


okkkk!!大功告成~!虽然但是偏导也没那么难哈哈哈哈哈哈 ~

这篇文章分析了似然函数和极大似然估计,并给出了对应代码,希望对你有所帮助!⭐
欢迎三连!!一起加油!🎇
——Geeker_LStar

这篇关于【初中生讲机器学习】12. 似然函数和极大似然估计:原理、应用与代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745373

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue: