【极大似然估计MLE】透彻理解机器学习中MLE的原理(附3D可视化代码)
作者:互联网
文章目录
相关资料
- 知乎:如何通俗地理解概率论中的「极大似然估计法」
- 视频:图解极大似然估计推导与3D可视化-maximum likelihood estimation and 3D visualization
- 源码地址:https://github.com/aespresso/a_journey_into_math_of_ml
- 博客:从最大似然到EM算法:一致的理解方式
一、什么是概率,什么是似然
- 似然:由实际推测参数
- 概率:由参数推测实际
二、极大似然估计 Maximum Likelihood Estimation (MLE) 的含义
极大似然估计的依据:概率最大的事件最有可能发生,或者说真实发生的事情总是概率最大的
极大似然估计的目的在于“找到一个产生当前观测到的数据概率最大的模型”
举个例子
我们投10次抛硬币,有6次是正。问你这个硬币的参数 θ \theta θ是多少(抛一次硬币出现正面的概率)
假设模型(硬币)的参数是 θ \theta θ(抛一次硬币出现正面的概率),则模型产生6次正面,4次正面的概率是 L ( θ ) = ( 10 6 ) θ 6 ( 1 − θ ) 4 L(\theta)=\left(\begin{array}{c}10 \\ 6\end{array}\right) \theta^{6}(1-\theta)^{4} L(θ)=(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(X),然后我们从现实世界中收集到了一批训练数据X,那其实就相当于从P(X)中采样了一部分数据,得到训练数据X。那么显然概率密度函数大的样本更容易被采样出来,也就是更容易被我们收集到。那现在既然我们收集到了这些数据,说明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中,我们通过最大化似然函数 l o g P ( x ) logP(x) logP(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_ = 1
for 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)
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_ = 0
for 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,likelihood,mu,sigma,infer,3D 来源: https://blog.csdn.net/qq_43827595/article/details/122176214