Python 从零开始实现机器学习实战(仅numpy实现) 01: 通过扔硬币的例子理解并求解极大似然估计(可能是全网最容易懂的例子)

极大似然估计(Maximum Likelihood Estimation)

极大似然估计(MLE)是一种在统计学中用于估计模型参数的方法。它的核心思想是通过观察到的数据来找到使得观察到的数据出现的概率最大的参数值。在许多统计模型中,我们假设观察到的数据是由一个概率分布生成的,而极大似然估计就是要找到这个概率分布的参数。

1. 基本概念

1.1 似然函数(Likelihood Function)

似然函数是关于模型参数的函数,表示给定模型下观察到的数据的概率。对于参数集 ( \theta ) 和观察到的数据集 ( D ),似然函数 ( L(\theta; D) ) 定义如下:

L ( θ ; D ) = P ( D ∣ θ ) L(\theta; D) = P(D | \theta) L(θ;D)=P(Dθ)

1.2 极大似然估计的目标

极大似然估计的目标是找到最大化似然函数的参数值,即:

θ ^ MLE = argmax θ   L ( θ ; D ) \hat{\theta}_{\text{MLE}} = \underset{\theta}{\text{argmax}} \, L(\theta; D) θ^MLE=θargmaxL(θ;D)

2. 过程步骤

2.1 联合概率分布的设定

首先,我们需要明确观察到的数据是由一个概率分布生成的。设 X X X 是观察数据的随机变量,其概率分布函数为 P ( X ; θ ) P(X; \theta) P(X;θ),其中 $$ \theta $$是需要估计的参数。

2.2 写出似然函数

通过联合概率分布,我们可以写出似然函数 L ( θ ; D ) L(\theta; D) L(θ;D)。对于独立同分布的数据 D = { x 1 , x 2 , . . . , x n } D = \{x_1, x_2, ..., x_n\} D={x1,x2,...,xn},似然函数可以表示为:

L ( θ ; D ) = P ( x 1 ; θ ) ⋅ P ( x 2 ; θ ) ⋅ . . . ⋅ P ( x n ; θ ) L(\theta; D) = P(x_1; \theta) \cdot P(x_2; \theta) \cdot ... \cdot P(x_n; \theta) L(θ;D)=P(x1;θ)P(x2;θ)...P(xn;θ)

2.3 对数似然函数化简

由于似然函数通常涉及多个相乘的项,为了方便计算,通常会对似然函数取对数,得到对数似然函数 ℓ ( θ ; D ) \ell(\theta; D) (θ;D)

ℓ ( θ ; D ) = log ⁡ L ( θ ; D ) \ell(\theta; D) = \log L(\theta; D) (θ;D)=logL(θ;D)

2.4 求解最大值

接下来,我们通过对数似然函数找到参数 ( \theta ) 的最大值。这通常涉及对 ( \ell(\theta; D) ) 关于 ( \theta ) 求导,令导数等于零,解出参数值。

∂ ℓ ( θ ; D ) ∂ θ = 0 \frac{\partial \ell(\theta; D)}{\partial \theta} = 0 θ(θ;D)=0

2.5 检验最大值

最后,要检验所得的参数值是否确实是似然函数的最大值,通常需要通过二阶导数测试或者观察似然函数的凹凸性来确认。

3. 举例说明

为了更好理解,我们以一个简单的例子来演示极大似然估计的步骤。

3.1 问题设定

假设我们有一组观察到的二项分布数据,用结果1表示扔硬币的正面,用结果0,表示扔硬币结果的反面,表示为 D = { 1 , 0 , 1 , 1 , 0 } D = \{1, 0, 1, 1, 0\} D={1,0,1,1,0},我们想要估计成功的概率 ( p )。

3.2 似然函数

二项分布的概率质量函数为 P ( x ; p ) = p x ⋅ ( 1 − p ) 1 − x P(x; p) = p^x \cdot (1-p)^{1-x} P(x;p)=px(1p)1x,1出现3次,取x=3, 则似然函数为:

L ( p ; D ) = p ⋅ ( 1 − p ) ⋅ p ⋅ p ⋅ ( 1 − p ) L(p; D) = p \cdot (1-p) \cdot p \cdot p \cdot (1-p) L(p;D)=p(1p)pp(1p)

3.3 对数似然函数

取对数似然函数:

ℓ ( p ; D ) = log ⁡ L ( p ; D ) = log ⁡ ( p ) + log ⁡ ( 1 − p ) + log ⁡ ( p ) + log ⁡ ( p ) + log ⁡ ( 1 − p ) \ell(p; D) = \log L(p; D) = \log(p) + \log(1-p) + \log(p) + \log(p) + \log(1-p) (p;D)=logL(p;D)=log(p)+log(1p)+log(p)+log(p)+log(1p)

3.4 求解最大值

对对数似然函数关于 ( p ) 求导,并令导数等于零,我们可以解出 ( p ) 的值。

∂ ℓ ( p ; D ) ∂ p = 1 p − 1 1 − p + 1 p + 1 p − 1 1 − p = 0 \frac{\partial \ell(p; D)}{\partial p} = \frac{1}{p} - \frac{1}{1-p} + \frac{1}{p} + \frac{1}{p} - \frac{1}{1-p} = 0 p(p;D)=p11p1+p1+p11p1=0

解得 p = 4 5 p = \frac{4}{5} p=54

3.5 检验最大值

通过二阶导数测试,我们可以确认 p = 4 5 p = \frac{4}{5} p=54确实是对数似然函数的最大值。

这就是极大似然估计的基本步骤和应用过程。在实际应用中,极大似然估计是估计模型参数最常用的方法之一。

极大似然估计(Maximum Likelihood Estimation,MLE)是一种常用的参数估计方,用于根据观测数据来估计概率分布的参数。在Python中,可以使用SciPy库中的stats模块来进行极大似然估计。 以下是一个简单的使用Python实现极大似然估计的示例程序: ```python import numpy as np from scipy.stats import norm # 假设观测到的数据服从正态分布 N(mu, sigma^2) mu_true = 5.0 sigma_true = 2.0 data = np.random.normal(mu_true, sigma_true, size=100) # 定义似然函数 def likelihood(mu, sigma, data): return np.prod(norm.pdf(data, mu, sigma)) # 极大似然估计 def mle(data): mu_hat = np.mean(data) sigma_hat = np.std(data) return mu_hat, sigma_hat # 计算似然函数在 mu, sigma 的取值下的值 mu_vals = np.linspace(0, 10, num=100) sigma_vals = np.linspace(0.1, 5, num=100) likelihood_vals = np.zeros((100, 100)) for i, mu in enumerate(mu_vals): for j, sigma in enumerate(sigma_vals): likelihood_vals[i, j] = likelihood(mu, sigma, data) # 找到最大似然估计的 mu, sigma 值 mu_mle, sigma_mle = mle(data) # 输出结果 print('True Parameters: mu={:.2f}, sigma={:.2f}'.format(mu_true, sigma_true)) print('MLE Parameters: mu={:.2f}, sigma={:.2f}'.format(mu_mle, sigma_mle)) ``` 这段代码中,我们首先生成了服从正态分布的观测数据。然后定义了似然函数likelihood,它计算给定参数mu和sigma下观测数据的似然值。接下来,我们实现极大似然估计函数mle,它使用观测数据来估计mu和sigma的值。最后,我们计算了似然函数在一定范围内mu和sigma的取值下的值,并找到使似然函数最大化的mu和sigma值,即最大似然估计的结果。 运行这段代码,我们可以得到真实参数和极大似然估计的参数值。 参考文献: [1] Statistics (scipy.stats) — SciPy v1.4.1 Reference Guide [2] Scipy:高级科学计算 | SciPy Lecture Notes 中文版 [3] python简单实现最大似然估计&scipy库的使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值