透彻理解机器学习中极大似然估计MLE的原理(附3D可视化代码)

article/2025/7/20 1:39:12

文章目录

  • 相关资料
  • 一、什么是概率,什么是似然
  • 二、极大似然估计 Maximum Likelihood Estimation (MLE) 的含义
    • 2.1 机器学习中的极大化似然函数
    • 2.2 极大似然估计和损失函数的关系
    • VAE最大化似然函数推导出损失函数
  • 三、代码可视化:极大似然估计
    • 3.1 似然函数 likelihood
    • 3.2 对数似然函数 log likelihood
  • 四、最大似然估计(MLE) 和最大后验概率估计(MAP)的区别

相关资料

  • 知乎:如何通俗地理解概率论中的「极大似然估计法」
  • 视频:图解极大似然估计推导与3D可视化-maximum likelihood estimation and 3D visualization
  • 源码地址:https://github.com/aespresso/a_journey_into_math_of_ml
  • 博客:从最大似然到EM算法:一致的理解方式

一、什么是概率,什么是似然

  • 似然:由实际推测参数
  • 概率:由参数推测实际

对于函数 P ( x ∣ θ ) P(x|\theta) P(xθ),输入x表示某一个具体的数据, θ \theta θ表示模型的参数

  • 如果 θ \theta θ是已经确定的, x x x是变量,那这个函数就叫做概率函数(probability function),它描述已知模型的情况下,不同的样本点x出现的概率是多少。
  • 如果 x x x是已经确定的, θ \theta θ是变量,那这个函数就叫做似然函数(likelihood function),它描述对于不同的模型参数 θ \theta θ,出现 x x x这个样本点的概率是多少。

这种形式我们之前也见过,比如 f ( x , y ) = x y f(x,y)=x^y f(x,y)=xy,如果x是已经确定的,如x=3,那么 f ( 3 , y ) = 3 y f(3,y) = 3^y f(3,y)=3y是指数函数,而如果y是已经确定的,如y=2,那么 f ( x , 2 ) = x 2 f(x,2)=x^2 f(x,2)=x2是幂函数。同一个数学形式,从不同变量角度考虑,可以有不同的名字。

二、极大似然估计 Maximum Likelihood Estimation (MLE) 的含义

极大似然估计建立在这样的思想上:假设我们手里有数据X(从现实世界收集而来,可看作从一个模型中采样的过程),我们希望求出能使观测数据X出现的概率最大的模型参数 θ \theta θ,我们把这个参数 θ \theta θ作为对模型真实参数的估计。所以说极大似然估计的目的在于“找到一个产生当前观测到的数据概率最大的模型”。

通常来说,在我们不知道如何训练一个模型时,往往可以从极大似然估计的角度去推导出损失函数,有了优化目标后我们就可以训练模型了。(见下文VAE最大化似然函数推导出损失函数)

极大似然估计的依据:概率最大的事件最有可能发生,或者说真实发生的事情总是概率最大的

举个例子

我们投10次抛硬币,有6次是正。问你这个硬币的参数 θ \theta θ是多少(抛一次硬币出现正面的概率)

假设模型(硬币)的参数是 θ \theta θ(抛一次硬币出现正面的概率),则模型产生6次正面,4次正面的概率是 L ( θ ) = P ( x ∣ θ ) = P ( x 1 ∣ θ ) ⋯ P ( x 10 ∣ θ ) = ( 10 6 ) θ 6 ( 1 − θ ) 4 L(\theta)=P(x|\theta) =P(x_1|\theta)\cdots P(x_{10}|\theta)=\left(\begin{array}{c}10 \\ 6\end{array}\right) \theta^{6}(1-\theta)^{4} L(θ)=P(xθ)=P(x1θ)P(x10θ)=(106)θ6(1θ)4

  • 模型1: L ( 0.5 ) ≈ 0.21 L(0.5)\approx 0.21 L(0.5)0.21
  • 模型2: L ( 0.6 ) ≈ 0.25 L(0.6)\approx 0.25 L(0.6)0.25

由于真实发生的事情总是概率最大的,所以说我们认为模型2 ( θ = 0.6 ) (\theta=0.6) (θ=0.6)比模型1 ( θ = 0.5 ) (\theta=0.5) (θ=0.5)更接近真实数据分布。

那如何找到最接近于真实数据分布的模型呢?

答:找到能使 L ( θ ) L(\theta) L(θ)最大的参数 θ \theta θ,则模型 ( θ ) (\theta) (θ)是最接近于真实数据分布的。

在这里插入图片描述

2.1 机器学习中的极大化似然函数

我们可以从极大化似然函数的角度去理解机器学习问题

例如,我现在手里有一堆训练数据 X X X,你给我一个模型,最能解释我现在产生的这些训练数据,也就是现在的训练集在这个模型下产生的概率应该是最大的。

  • 模型A(某种分布)产生训练集X的概率是0.9
  • 模型B(另一种分布)也能产生训练集X,但是概率只有0.3

那我当然认为模型A更接近于训练数据的真实数据分布。因为真实发生的事情总是概率最大的

你想啊,在上帝视角,数据服从真实数据分布 P r e a l ( x ) P_{real}(x) Preal(x),然后我们从现实世界中收集到了一批训练数据X,那其实就相当于从 P r e a l ( x ) P_{real}(x) Preal(x)中采样了一部分数据,得到训练数据X。那么显然概率密度函数大的样本更容易被采样出来,也就是更容易被我们收集到。那现在既然我们收集到了这些数据,说明X来自于能使它出现概率最大的模型(某种分布)

极大似然函数的具体做法:通过改变模型的参数,去找到一个能使产生这些训练数据概率最大(似然函数 P θ ( x ) P_\theta(x) Pθ(x)最大)的一个模型。

2.2 极大似然估计和损失函数的关系

What is the difference between loss function and MLE?

  • A loss function is a measurement of model misfit as a function of the model parameters. Loss functions are more general than solely MLE.
  • MLE is a specific type of probability model estimation, where the loss function is the (log) likelihood. To paraphrase Matthew Drury’s comment, MLE is one way to justify loss functions for probability models.

通常来说,在我们不知道如何训练一个模型时,往往可以从极大似然估计的角度去推导出损失函数,有了优化目标后我们就可以训练模型了

You can think of MLE as a philosophical principle for writing down loss functions.
你可以认为极大似然估计函数是推导出损失函数的一种方法

  • 在分类问题中(包括二分类和多分类),可推导出交叉熵损失函数 (cross-entropy loss);
  • 在回归问题中,可以推导出最小均方差损失 (mean square error);

VAE最大化似然函数推导出损失函数

例如,在VAE中,我们通过最大化似然函数 l o g θ P ( x ) log_\theta P(x) logθP(x)的思想,以及最大化variational lower bound (ELBO)的方法,推导出来VAE的损失函数是重构损失+正则损失,这样我们就能够去训练模型了。
在这里插入图片描述

Connection between loss and likelihood function

  • In linear regression and logistic regression, without regularization, we can think the objective is to maximize likelihood.
  • On the other hand, we the term "loss function" is more general than likelihood.
  • For example, we can add regularization (See Regularization methods for logistic regression).
  • We can also add other constraints or use weighted loss. All of these are “add on” to likelihood.

其他:最大化似然函数与最小化损失函数的关系

三、代码可视化:极大似然估计

3.1 似然函数 likelihood

数据: X observation  = { x 1 , x 2 , … , x N } X_{\text {observation }}=\left\{x_{1}, x_{2}, \ldots, x_{N}\right\} Xobservation ={x1,x2,,xN}

似然函数: L ( μ , σ ∣ X ) = P ( X ∣ μ , σ ) = ∏ i = 1 N P ( x i ∣ μ , σ ) L(\mu, \sigma \mid X)=P(X \mid \mu, \sigma)=\prod_{i=1}^{N} P\left(x_{i} \mid \mu, \sigma\right) L(μ,σX)=P(Xμ,σ)=i=1NP(xiμ,σ)

from scipy import stats
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot# 首先定义观测的数据分布, 我们定义一个均值为0, 标准差为4的正态分布, 
# 并从中随机抽200个数据点作为观测到的数值
obs_mu, obs_sigma = 0, 4
observations = np.random.normal(obs_mu, obs_sigma, 200)# 定义似然函数
def likelihood(observations, infer_mu, infer_sigma):# 定义似然函数, observations为观测到的数据点# infer_mu, infer_sigma为推断的均值和标准差product_ = 1for obs in observations:# 代入每一个数据点到我们假设的概率密度函数内, 并求它们的积product_ *= stats.norm.pdf(obs, loc=infer_mu, scale=infer_sigma)return product_# 我们定义一个参数的取值范围, 均值在(-0.5, 0.5)之间
# 标准差在(3.5, 4.5)之间
all_infer_mu = [i/10 for i in range(-5, 5)]
all_infer_sigma = [i/10 for i in range(35, 45)]# 求得每一个参数组合的似然值
mle = []
for infer_mu in all_infer_mu:temp_lis = []for infer_sigma in all_infer_sigma:temp_lis.append(likelihood(observations, infer_mu, infer_sigma))mle.append(temp_lis)# 进行似然函数的3D可视化
data = [go.Surface(x=all_infer_mu, y=all_infer_sigma, z=mle)]
layout = go.Layout(title="Likelihood", scene={"xaxis": {'title': "mean"}, "yaxis": {"title": "sigma"},"zaxis": {"title": "likelihood"}})
fig = go.Figure(data=data, layout=layout)
iplot(fig)

下图每个参数 θ = ( μ , σ ) \theta=(\mu,\sigma) θ=(μ,σ)都对应一个模型,由于参数 θ = ( 0.1 , 4.1 ) \theta=(0.1,4.1) θ=(0.1,4.1)对应的模型的似然函数值最大,所以我们认为这个模型是最接近与真实模型的
在这里插入图片描述

3.2 对数似然函数 log likelihood

对数似然函数: L ( μ , σ ∣ X ) = ∑ i = 1 N log ⁡ P ( x i ∣ μ , σ ) \mathcal{L}(\mu, \sigma \mid X)=\sum_{i=1}^{N} \log P\left(x_{i} \mid \mu, \sigma\right) L(μ,σX)=i=1NlogP(xiμ,σ)

什么要对似然函数取对数?

  • 首先原本的似然函数是很多条件概率的乘积, 我们在找极大值的时候需要求似然函数的导数, 而乘积的导数不方便计算, 取对数可以吧乘除变成加减;
  • 对似然函数取对数, 原本函数的极大值的位置没有改变;
  • 如果观测到的数据点比较多, 原始似然函数的乘积可能非常接近于0, 甚至超出计算机的储存位数限制, 这样就全变成0了, 取对数可以把接近于0的数变成很大的负数, 也就是把原本似然函数的取值范围从0到1扩展到了 − ∞ -\infty 到0, 方便了计算.
from scipy import stats
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot# 首先定义观测的数据分布, 我们定义一个均值为0, 标准差为4的正态分布, 
# 并从中随机抽200个数据点作为观测到的数值
obs_mu, obs_sigma = 0, 4
observations = np.random.normal(obs_mu, obs_sigma, 200)def log_likelihood(observations, infer_mu, infer_sigma):sum_ = 0for obs in observations:sum_ += stats.norm.logpdf(obs, loc=infer_mu, scale=infer_sigma)return sum_# 我们定义一个参数的取值范围, 均值在(-0.5, 0.5)之间
# 标准差在(3.5, 4.5)之间
all_infer_mu = [i/10 for i in range(-5, 5)]
all_infer_sigma = [i/10 for i in range(35, 45)]# 求得每一个参数组合的似然值
mle = []
for infer_mu in all_infer_mu:temp_lis = []for infer_sigma in all_infer_sigma:temp_lis.append(log_likelihood(observations, infer_mu, infer_sigma))mle.append(temp_lis)# 进行似然函数的3D可视化
data = [go.Surface(x=all_infer_mu, y=all_infer_sigma, z=mle)]
layout = go.Layout(title="Likelihood", scene={"xaxis": {'title': "mean"}, "yaxis": {"title": "sigma"},"zaxis": {"title": "likelihood"}})
fig = go.Figure(data=data, layout=layout)
iplot(fig)

在这里插入图片描述

四、最大似然估计(MLE) 和最大后验概率估计(MAP)的区别

详见我的另一篇博客:终于明白极大似然估计MLE和最大后验估计MAP的原理


http://chatgpt.dhexx.cn/article/O2weK8ro.shtml

相关文章

C#RSA密码以及利用欧几里得算法实现两数互质的判断

最近做课程设计,想到以前看过RSA密码的相关内容,于是就想用刚学的C#做一个数字加密系统。RSA加密的流程如下: 来看一个“玩具式”的例子: (1)选取两个素数p2,q11,于是N22. (2)构造数,这是小于22且不含因数2和11的自然数的个数。 (3)选一个…

判断两数互质,java实现

数组下标i和j值互质时,a[i][j] true,反之false Write a program to create an n * n Boolean array. If I and j are coprime, a [i] [J] is true, otherwise it is false /** * When Array index Mutuality ,a[i][j] true,else is false * 数组i和j值互质时&…

两个质数互质是_两个数互质是什么意思 如何判断

互质数为数学中的一种概念,即两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数,叫做互质数。下面是小编整理的详细内容,一起来看看吧! 两个数互质是什么意思 质数为数学中的一种概念,即两个或多…

char、wchar_t、ACHAR、WCHAR、TCHAR

最近用到上面几种不同的字符类型,下面贴上在网上收集到的资料。 1、char 单字节变量类型,最多表示256个字符。 2、wchar_t 宽字节变量类型,用于表示Unicode字符,它实际定义在<string.h>里:typedef unsigned short wchar_t。 定义宽字节类型方法如下: wchar_…

wchar* 转换成 string

wchar* 转换成 string 123 windows 类型转换问题 1 // Your wchar_t* wstring ws(L"Hello World"); // your new String std::string str(ws.begin(), ws.end()); // Show String std::cout << str << std::endl; 2 std::wstring wstr(L"Test&…

wchar_t类型

今天在看前辈的项目的时候学习到了一个以前没有通过的数据类型&#xff1a;宽字符wchar_t类型。 先来看看他占多大的空间吧&#xff0c; 从图中可以看到wchar_t占的空间的大小为2个字节&#xff0c; 然后来确定一下他是无符号还是有符号的 由上图可见&#xff0c;他应该是无符号…

char与wchar_t字符串

C里的字符串类型是比较二的&#xff0c;因为有太多表示方法&#xff1a;char*、string、字符串数组、wchar_t*、wstring&#xff0c;今天就来缕一缕这些玩意。 char* char* 貌似是C字符串最基础最核心的。 看以下四个字符串声明及输出结果&#xff1a; 先说说核心&#xff0c…

wchar_t的用法

wchar_t的解释可以看这里:这里 程序和解析: 1 # include<stdio.h>2 # include<stdlib.h>3 # include<locale.h>//设置本地化<

WCHAR的简单操作

WCHAR 是双字节类型&#xff0c;一般它用来存储那些双字节而不是单字节字符.较长的字节数可以支持 在应用程序的国际发布版本里所使用的扩展字符集(如常用的Unicode字符集). 比如说&#xff1a;在中文系统下开发的软件&#xff0c;当应用到日文操作系统时&#xff0c;如果没有采…

ADI Diff-Amp Calculator差分放大器件计算器使用方法

Diff-Amp Calculator便于计算单端转差分放大&#xff0c;差分转差分放大&#xff0c;在满足输入信号和输出信号的参数要求下&#xff0c;配置元件增益自动计算Rf和Rg阻值大小。 下载地址&#xff1a;https://www.analog.com/cn/design-center/interactive-design-tools/adi-dif…

双电阻差分电流采样_差分信号和差分电路讲解 差分放大电路应用

1、什么是差分信号?为什么要用差分信号? 两个芯片要通信,我们把它们用一根导线连接起来,一个传输 1,另一个接受 1,一个传输 0,另一个接受 0,不是很好吗?为什么还要搞其他的花花肠子。 因为有干扰,各种各样的干扰,比如温度,电磁辐射等等,这些干扰使得传输的 1 不再…

双电阻差分电流采样_差分放大电路的应用

差分运算放大电路,对共模信号得到有效抑制,而只对差分信号进行放大,因而得到广泛的应用。 1、如下图是差分电路的电路构型 目标处理电压:是采集处理电压,比如在系统中像母线电压的采集处理,还有像交流电压的采集处理等。 差分同相/反相分压电阻:为了得到适合运放处理的电…

全差分放大器(FDA)的基本知识

为了获得最佳性能&#xff0c;用户必须在信号链上选择一个balun(平衡不平衡变换器&#xff09;&#xff0c;虽然这可能会导致某些应用中的耦合问题。然而&#xff0c;耦合问题并不是总是发生&#xff0c;特别是在某些需要DC分量的测试和测量应用中更是如此。 全差分放大器 (FDA…

3.0.MATLAB版线性代数-矩阵加法、数乘、乘法、求逆

矩阵运算及其应用(加法、数乘、乘法、求逆) 加法数乘运算规则乘法矩阵乘法定义线性变换多次线性变换等于矩阵的连乘线性方程组看做矩阵乘法矩阵的转置矩阵的逆(“除法”)矩阵逆的定义矩阵逆的性质求逆矩阵的方法(求逆1)MATLAB中求逆矩阵的分块向量等式初等矩阵初等矩阵和…

算法:动态规划—矩阵链相乘

问题描述 给定n个矩阵&#xff5b;A1,A2,…,An&#xff5d;&#xff0c;其中Ai与A i1是可乘的&#xff0c;i1&#xff0c;2…&#xff0c;n-1。如何确定计算矩阵连乘积的计算次序&#xff0c;使得依此次序计算矩阵连乘积需要的数乘次数最少 解法 1.穷举法&#xff1a; 列举…

Java实现矩阵的加、减、乘、数乘、转置、幂运算

Java实现矩阵的加、减、乘、数乘、转置、幂运算 首先需要一个矩阵对应的类 Matrix. 命名为Matrix import java.util.Arrays; /*** author yiran* creat 2021-11-26-13:58*/ public class Matrix{// 矩阵private double[][] matrix;// m x n private int m;private int n;publ…

【数理知识】向量数乘,内积,外积,matlab代码实现

序号内容1【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现2【数理知识】矩阵普通乘积&#xff0c;哈达玛积&#xff0c;克罗内克积&#xff0c;点乘&#xff0c;点积&#xff0c;叉乘&#xff0c;matlab代码实现 文章目录 1. 向量基本形式2. …

Eigen入门系列 —— Eigen::Matrix矩阵基本加减、数乘运算

Eigen入门系列 —— Eigen::Matrix矩阵基本加减、数乘运算 前言程序说明输出结果代码示例 前言 随着工业自动化、智能化的不断推进&#xff0c;机器视觉&#xff08;2D/3D&#xff09;在工业领域的应用和重要程度也同步激增&#xff08;识别、定位、抓取、测量&#xff0c;缺陷…

07-行向量列向量_向量的运算 加法,数乘,减法,转置

行向量和列向量 其实它们非常简单&#xff0c;所谓的行向量就是我们的向量表示&#xff0c;一组数这组数码成一行&#xff0c;那么所谓的列向量呢&#xff1f;就是这组数码成一列而已&#xff0c;那么对于行向量还是列向量&#xff0c;在我们的学习中是并没有区别的&#xff0…

矩阵相乘求解最小数乘次数

矩阵连乘问题&#xff1a; 给定n 个矩阵(A0,A1,....An-1) 其中 Ai 和 Ai1 是可乘的&#xff0c; i0, 1,... , n-2 . 求解计算这n 个矩阵的连乘积A0A1....An-1 。 由于矩阵连乘满足结合律&#xff0c;因此矩阵的乘法可以有多种不同的计算次序&#xff0c;每种计算次序对应不同…