【初中生讲机器学习】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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/414163.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day04:APP架构小程序H5+Vue语言Web封装原生开发Flutter

目录 常见APP开发架构 APP-开发架构-原生态-IDEA APP-开发架构-Web封装-平台 APP-开发架构-H5&Vue-HBuilderX WX小程序-开发架构-Web封装-平台 WX小程序-开发架构-H5&Vue-HBuilderX 思维导图 章节知识点: 应用架构:Web/APP/云应用/三方服…

[CISCN 2019华东南]Web11

打开题目 看到xff就应该想到抓包 看回显也是127.0.0.1,我们盲猜是不是ssti模板注入 输入{{7*7}}显示49 可以看的出来flag在根目录下 输入{system(‘cat /flag’)} 得到flag 知识点: 漏洞确认 一般情况下输入{$smarty.version}就可以看到返回的smarty…

nebula容器方式安装:docker 安装nebula到windows

感谢阅读 基础环境安装安装docker下载nebula 安装数据库命令行安装查询network nebula-docker-compose_nebula-net并初始化查询安装初始使用root(God用户类似LINUX的root) 关闭服务 安装UI 基础环境安装 安装docker 点我下载docker 下载nebula 数据…

Python 实现Excel自动化办公(中)

在上一篇文章的基础上进行一些特殊的处理,这里的特殊处理主要是涉及到了日期格式数据的处理(上一篇文章大家估计也看到了日期数据的处理是不对的)以及常用的聚合数据统计处理,可以有效的实现你的常用统计要求。代码如下&#xff1…

Spring Boot项目误将Integer类型写成int来进行传参

在处理项目中Idea中无报错: 问题: localhost:8080/param/m2在浏览器中输入:localhost:8080/param/m2 产生报错: This application has no explicit mapping for /error, so you are seeing this as a fallback. Tue Feb 27 20:55…

MATLAB_ESP32有限脉冲响应FIR无限脉冲响应IIR滤波器

要点 ESP32闪烁LED,计时LEDESP32基础控制:温控输出串口监控,LCD事件计数器,SD卡读写,扫描WiFi网络,手机控制LED,经典蓝牙、数字麦克风捕捉音频、使用放大器和喇叭、播放SD卡和闪存MP3文件、立体…

使用 kubeadm 部署k8s集群

一、所有节点系统初始化 1、常规初始化 2、内核版本升级以及内核限制文件参数修改 还可以考虑将旧版本的内核卸载 二、准备nginx负载均衡器和keepalived nginx四层代理: keepalived配置: nginx检测脚本: 三、所有节点部署docker&#xff0c…

2023年06月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

一、单选题(共10题,共30分) 第1题 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A:编辑 B:保存 C:调试 D:编译 答案:D 第2题 默认小猫角色,执行下列程序,说法错误的是?( ) A:不按下空格键,小猫会随机移动 B:不按下空格…

高防IP简介

高防IP可以防御的有包括但不限于以下类型: SYN Flood、UDP Flood、ICMP Flood、IGMP Flood、ACK Flood、Ping Sweep 等攻击。高防IP专注于解决云外业务遭受大流量DDoS攻击的防护服务。支持网站和非网站类业务的DDoS、CC防护,用户通过配置转发规则&#x…

STM32F103学习笔记(六) RTC实时时钟(应用篇)

目录 1. RTC 实时时钟的应用场景 2. RTC 的配置与初始化 2.1 设置 RTC 时钟源 2.2 初始化 RTC 寄存器 2.3 中断配置 2.4 备份寄存器配置 2.5 校准 RTC 3. 实例演示代码 4. 总结 1. RTC 实时时钟的应用场景 实时时钟(RTC)在嵌入式系统中具有广泛…

html5盒子模型

1.边框的常用属性 border-color 属性 说明 示例 border-top-color 上边框颜色 border-top-color:#369; border-right-color 右边框颜色 border-right-color:#369; border-bottom-color 下边框颜色 border-bottom-color:#fae45b; border-left-color 左边框颜色…

phpldapadmin This base cannot be created with PLA

phpldapadmin This base cannot be created with PLA 1、问题描述2、问题分析3、解决方法:创建根节点 1、问题描述 安装phpldapadmin参考链接: https://blog.csdn.net/OceanWaves1993/article/details/136048686?spm1001.2014.3001.5501 刚安装完成phpldapadmin&…

括号生成(力扣题目22)

题目描述: 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["((()))","(()())","(())()&q…

备战蓝桥杯————k个一组反转单链表

k个反转单链表,顾名思义就是k个节点为一组进行反转,这是一道困难的题目,如何解答,可以在我们前面的反转链表中得到思路。 如何 K 个一组反转单链表 题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转&#xf…

STC-ISP原厂代码研究之 V3.7d汇编版本

最近在研究STC的ISP程序,用来做一个上位机烧录软件,逆向了上位机软件,有些地方始终没看明白,因此尝试读取它的ISP代码,但是没有读取成功。应该是目前的芯片架构已经将引导代码放入在了单独的存储块中,而这存储块有硬件级的使能线,在面包板社区-宏晶STC单片机的ISP的BIN文…

802.11局域网的 MAC 帧

目录 802.11 局域网的 MAC 帧 802.11 数据帧的三大部分 1.关于 802.11 数据帧的地址 最常用的两种情况 2.序号控制字段、持续期字段和帧控制字段 802.11 局域网的 MAC 帧 802.11 帧共有三种类型:控制帧、数据帧和管理帧。 802.11 数据帧的三大部分 MAC 首部&…

千卡利用率超98%,详解JuiceFS在权威AI测试中的实现策略

2023 年 9 月,AI 领域的权威基准评测 MLPerf 推出了 Storage Benchmark。该基准测试通过模拟机器学习 I/O 负载的方法,在不需要 GPU 的情况下就能进行大规模的性能压测,用以评估存储系统的在 AI 模型训练场景的适用性。 目前支持两种模型训练…

07 Qt自绘组件:图片预览小组件ImageViewer

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起:自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起:自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件:令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

CentOS7 Hive2.3.8安装

CentOS7 Hive2.3.8 安装 建议从头用我的博客,如果用外教的文件到 一、9)步骤了,就用他的弄完,数据库不一样,在9步骤前还能继续看我的 一、 安装MySQL 0.0)查询mariadb,有就去0.1),没有就不管…

element el-table表格内容宽度自适应,不换行,不隐藏

2024.2.27今天我学习了如何用el-table实现表格宽度的自适应,当我们动态渲染表格数据的时候,有时候因为内容太多会出现挤压换行的效果: 我们需要根据内容的最大长度设置动态的宽度,这边我在utils里面封装了一个js: //…