第1章: 伯努利模型的极大似然估计与贝叶斯估计

伯努利模型的极大似然估计与贝叶斯估计

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta, bernoulli
from scipy.optimize import minimize_scalar

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 1. 生成伯努利试验数据
np.random.seed(42)
true_theta = 0.7  # 真实概率
n = 100  # 试验次数
data = bernoulli.rvs(true_theta, size=n)
k = sum(data)  # 成功次数

print(f"试验次数: {n}, 成功次数: {k}")

# 2. 极大似然估计
theta_mle = k / n
print(f"极大似然估计值: {theta_mle:.4f}")

# 3. 贝叶斯估计
# 3.1 均匀先验 (Beta(1,1))
alpha_unif, beta_unif = 1, 1
theta_map_unif = (k + alpha_unif - 1) / (n + alpha_unif + beta_unif - 2)
print(f"均匀先验的MAP估计: {theta_map_unif:.4f}")

# 3.2 Beta(2,2)先验
alpha_beta, beta_beta = 2, 2
theta_map_beta = (k + alpha_beta - 1) / (n + alpha_beta + beta_beta - 2)
print(f"Beta(2,2)先验的MAP估计: {theta_map_beta:.4f}")

# 4. 可视化
theta_range = np.linspace(0, 1, 1000)

# 似然函数
likelihood = theta_range**k * (1-theta_range)**(n-k)

# 后验分布 (Beta先验)
posterior_unif = beta.pdf(theta_range, k+alpha_unif, n-k+beta_unif)
posterior_beta = beta.pdf(theta_range, k+alpha_beta, n-k+beta_beta)

plt.figure(figsize=(12, 6))
plt.plot(theta_range, likelihood, label='似然函数', color='blue')
plt.plot(theta_range, posterior_unif, label='均匀先验后验', color='green')
plt.plot(theta_range, posterior_beta, label='Beta(2,2)先验后验', color='red')
plt.axvline(true_theta, color='black', linestyle='--', label='真实值')
plt.axvline(theta_mle, color='blue', linestyle=':', label='MLE估计')
plt.axvline(theta_map_unif, color='green', linestyle=':', label='均匀先验MAP')
plt.axvline(theta_map_beta, color='red', linestyle=':', label='Beta先验MAP')
plt.title('伯努利参数估计比较')
plt.xlabel('θ')
plt.ylabel('概率密度')
plt.legend()
plt.show()

# 5. 经验风险最小化验证
def neg_log_likelihood(theta):
    return -np.sum(data * np.log(theta) + (1-data) * np.log(1-theta))

res = minimize_scalar(neg_log_likelihood, bounds=(0.001, 0.999), method='bounded')
print(f"通过优化得到的最优θ: {res.x:.4f} (应与MLE相同)")

proscess

数据生成

  • 使用bernoulli.rvs生成100次伯努利试验数据
  • 设置真实概率为0.7

极大似然估计

  • 直接计算成功次数k与总次数n的比值
  • 计算公式:
    θ ^ = k n \hat{\theta} = \frac{k}{n} θ^=nk

贝叶斯估计

实现了两种先验分布:

  1. 均匀先验 (Beta(1,1))
  2. Beta(2,2)先验

MAP估计公式:
θ ^ = k + α − 1 n + α + β − 2 \hat{\theta} = \frac{k + \alpha - 1}{n + \alpha + \beta - 2} θ^=n+α+β−2k+α−1

结果

  • 绘制似然函数曲线
  • 绘制两种先验下的后验分布曲线
  • 标出真实值和各估计值(MLE、MAP等)

经验风险最小化验证

  • 通过最小化负对数似然函数来验证
  • 验证结果应与MLE估计一致

统计学习方法三要素

方法 模型 策略 算法
极大似然估计 概率模型 经验风险最小化 数值解
贝叶斯估计 概率模型 结构风险最小化 解析解

1. 极大似然估计

设 x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn为n次独立实验产生的结果,其中k次的结果为1。

1.1 似然函数

设 P ( x = 1 ) = θ P(x=1) = \theta P(x=1)=θ,则 P ( x = 0 ) = 1 − θ P(x=0) = 1-\theta P(x=0)=1−θ

似然函数:
L ( x 1 , x 2 , . . . , x n ; θ ) = θ k ( 1 − θ ) n − k (1) L(x_1, x_2,..., x_n;\theta) = \theta^k(1-\theta)^{n-k} \tag{1} L(x1,x2,...,xn;θ)=θk(1−θ)n−k(1)

解释:由于数据独立,可直接用幂次简化计算。

1.2 对数似然函数

ln ⁡ L = k ln ⁡ θ + ( n − k ) ln ⁡ ( 1 − θ ) (2) \ln L = k\ln\theta + (n-k)\ln(1-\theta) \tag{2} lnL=klnθ+(n−k)ln(1−θ)(2)

1.3 求导并求极值

d d θ ln ⁡ L = k θ − n − k 1 − θ = 0 (3) \frac{d}{d\theta}\ln L = \frac{k}{\theta} - \frac{n-k}{1-\theta} = 0 \tag{3} dθdlnL=θk−1−θn−k=0(3)

解得:
θ = k n (4) \theta = \frac{k}{n} \tag{4} θ=nk(4)

2. 贝叶斯估计

2.1 均匀分布先验

假设 θ ∼ U [ 0 , 1 ] \theta \sim U[0,1] θ∼U[0,1], f ( θ ) = 1 f(\theta)=1 f(θ)=1

后验概率:
P ( θ ∣ D ) ∝ P ( D ∣ θ ) = θ k ( 1 − θ ) n − k (5) P(\theta|D) \propto P(D|\theta) = \theta^k(1-\theta)^{n-k} \tag{5} P(θ∣D)∝P(D∣θ)=θk(1−θ)n−k(5)

2.2 贝塔分布先验(修正正态分布错误)

贝塔分布PDF:
f ( θ ; α , β ) = Γ ( α + β ) Γ ( α ) Γ ( β ) θ α − 1 ( 1 − θ ) β − 1 (6) f(\theta;\alpha,\beta) = \frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)}\theta^{\alpha-1}(1-\theta)^{\beta-1} \tag{6} f(θ;α,β)=Γ(α)Γ(β)Γ(α+β)θα−1(1−θ)β−1(6)

后验分布:
P ( θ ∣ D ) ∝ θ k + α − 1 ( 1 − θ ) n − k + β − 1 (7) P(\theta|D) \propto \theta^{k+\alpha-1}(1-\theta)^{n-k+\beta-1} \tag{7} P(θ∣D)∝θk+α−1(1−θ)n−k+β−1(7)

注意 :先前正态分布的例子错误,因为 θ ∈ [ 0 , 1 ] \theta\in[0,1] θ∈[0,1]。

3. 经验风险最小化与极大似然估计

当使用对数损失函数时:

最小化经验风险:
min ⁡ 1 N ∑ i = 1 N − ln ⁡ P ( Y i ∣ X i , θ ) (8) \min \frac{1}{N}\sum_{i=1}^N -\ln P(Y_i|X_i,\theta) \tag{8} minN1i=1∑N−lnP(Yi∣Xi,θ)(8)

等价于最大化:
1 N ln ⁡ ∏ i = 1 N P ( Y i ∣ X i , θ ) (9) \frac{1}{N}\ln \prod_{i=1}^N P(Y_i|X_i,\theta) \tag{9} N1lni=1∏NP(Yi∣Xi,θ)(9)

即极大化似然函数:
L = ∏ i = 1 N P ( Y i ∣ X i , θ ) (10) L = \prod_{i=1}^N P(Y_i|X_i,\theta) \tag{10} L=i=1∏NP(Yi∣Xi,θ)(10)

证毕:两者在条件概率分布和对数损失下等价。

相关推荐
张朝阳的博客33 分钟前
哈夫曼树Python实现
开发语言·python
里探1 小时前
FastAPI的初步学习(Django用户过来的)
python·django·fastapi
程序员一诺python2 小时前
【Django开发】django美多商城项目完整开发4.0第2篇:项目准备,配置【附代码文档】
后端·python·django·框架
面朝大海,春不暖,花不开2 小时前
Java服务提供者模式实现指南
java·开发语言·python
mit6.8242 小时前
[Data Pipeline] MinIO存储(数据湖) | 数据层 Bronze/Silver/Gold
数据库·python
love530love3 小时前
Python 开发环境全栈隔离架构:从 Anaconda 到 PyCharm 的四级防护体系
运维·ide·人工智能·windows·python·架构·pycharm
烧烤店小蚂蚁3 小时前
打卡Day55
python
刘瑞瑞rr3 小时前
python画三维立体图
开发语言·python
草明4 小时前
Python pip 以及 包的升级
windows·python·pip
新知图书4 小时前
OpenCV+Python实战人脸检测
人工智能·python·opencv