楼主: smallpox009
1187 2

[其他] 最大似然估计(MLE)和MAP(最大后验概率) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.7070
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-10-23
最后登录
2018-10-23

楼主
smallpox009 发表于 2025-12-8 17:44:15 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

最大似然估计(MLE)与最大后验估计(MAP)原理及对比

最大似然估计(MLE)的基本思想

最大似然估计的核心目标是寻找一组参数,使得在该参数下观测到当前样本数据的概率最大化。假设样本之间相互独立且服从相同分布(i.i.d.),则似然函数可表示为:

L(θ) = ∏i=1n P(xi∣θ)

为了便于计算,通常对似然函数取对数,转化为对数似然形式:

log L(θ) = ∑i=1n log P(xi∣θ)

通过优化方法(如梯度下降)求解使对数似然最大的参数 θ。

适用场景

  • 当训练数据量较大时,MLE估计值趋于真实参数值。
  • 适用于模型结构简单、不依赖先验知识的场景,例如频率学派框架下的参数推断。
  • 广泛应用于线性回归和逻辑回归等经典模型中的参数学习过程。

交叉熵损失函数的由来

在逻辑回归中,输出服从伯努利分布,即每次预测只有两种结果:成功(1)或失败(0)。此时,极大似然估计的目标函数可写为:

max log L(θ) = ∑i=1n log P(xi∣θ) = ∑i=1n log [p(xi)yi (1p(xi))(1yi)] = ∑i=1n [yi log(pi) + (1yi) log(1pi)]

将其转换为最小化问题,得到负对数似然函数,也即交叉熵损失:

min L(w) = ∑i=1n [yi log(pi) + (1yi) log(1pi)]

其中 pi = σ(z),z = wx + b,σ(z) 是 sigmoid 函数,定义如下:

σ(z) = 1 / (1 + ez)

xi 表示第 i 个样本的特征向量,yi 为其对应标签(0 或 1),w 为待优化的权重参数(含偏置项)。

损失函数对参数的导数推导

首先计算 sigmoid 函数的导数:

σ(z)/z = σ(z)(1 σ(z))

进一步求其对 w 和 b 的偏导:

σ(z)/w = (σ(z)/z) x,σ(z)/b = σ(z)/z

于是损失函数关于 w 的梯度为:

L(w)/w = ∑i=1n xi [ yi (σ′(z)/σ(z)) + (1yi) (σ′(z)/(1σ(z))) ] = ∑i=1n xi [ yi(1σ(z)) (1yi)σ(z) ] = ∑i=1n xi [ yi σ(z) ]

最大后验估计(MAP)原理

与 MLE 不同,MAP 引入了参数的先验分布,将参数视为具有某种概率分布的随机变量。其目标是最大化后验概率 P(θ∣D),根据贝叶斯公式:

P(θ∣D) ∝ P(D∣θ) P(θ)

取对数后得:

log P(θ∣D) = log P(D∣θ) + log P(θ) + const = log L(θ) + log P(θ) + const

因此,MAP 相当于在对数似然的基础上增加了一个先验项 log P(θ),起到了正则化的作用。例如,若假设参数服从高斯先验,则对应 L2 正则;若为拉普拉斯先验,则对应 L1 正则。

MLE 与 MAP 的比较及选择建议

  • 数据充足时:MLE 表现良好,估计结果稳定,收敛性好。
  • 数据稀疏或易过拟合时:推荐使用 MAP,因其引入先验信息,有助于控制模型复杂度。
  • 是否需要领域知识引导:若已有对参数分布的经验判断,MAP 更具优势;否则可优先采用 MLE。
  • 哲学立场差异:MLE 属于频率学派方法,强调数据本身的统计特性;MAP 则属于贝叶斯学派,强调参数的不确定性建模。

[此处为图片1]

对逻辑回归中的损失函数 \( L(w) \) 关于参数 \( w \) 求偏导,过程如下:

\[ \frac{\partial L(w)}{\partial w} = -\sum_{i=1}^{n} x_i \left[ y_i \frac{\sigma'(z)}{\sigma(z)} + (1 - y_i) \frac{-\sigma'(z)}{1 - \sigma(z)} \right] \] \[ = -\sum_{i=1}^{n} x_i \left[ y_i (1 - \sigma(z)) - (1 - y_i) \sigma(z) \right] \] \[ = -\sum_{i=1}^{n} x_i \left[ y_i - \sigma(z) \right] \]

当模型包含多个参数时,\( w \) 以向量形式表示,此时梯度可表示为:

\[ \frac{\partial L}{\partial w} = X^T (\sigma(Xw) - y) \] [此处为图片1]

逻辑回归中的梯度下降实现

import numpy as np

np.random.seed(0)

# Sigmoid 函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 交叉熵损失函数
def cross_entropy_loss(y_true, y_pred):
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

# 梯度计算
def compute_gradients(X, y_true, y_pred):
    m = len(y_true)
    dw = np.dot(X.T, (y_pred - y_true))
    return dw / m

# 梯度下降算法
def gradient_descent(X, y, learning_rate=0.001, epochs=50000):
    m, n = X.shape
    weights = np.ones((n, 1))  # 初始化权重
    losses = []  # 存储每轮的损失值

    for epoch in range(epochs):
        logits = np.dot(X, weights)
        y_pred = sigmoid(logits)
        accurate_rate = (((y_pred > 0.5).astype(int) == y).sum()) / m
        loss = cross_entropy_loss(y, y_pred)
        losses.append(loss)
        gradients = compute_gradients(X, y, y_pred)
        weights -= learning_rate * gradients

        if epoch % 5000 == 0:
            print(f'Epoch {epoch}, Loss: {loss:.4f}, accurate: {accurate_rate*100:.2f}%')
    
    return weights, losses

# 数据生成部分
X = np.random.randn(100, 2)
X_with_bias = np.column_stack([X, np.ones(X.shape[0])])
true_weights = np.array([[2], [-1], [0.5]])
logits = np.dot(X_with_bias, true_weights)
probabilities = sigmoid(logits)
y = (probabilities > 0.5).astype(int)

learned_weights, losses = gradient_descent(X_with_bias, y)
print("True weights:", true_weights)
print("Learned weights:", learned_weights)

[此处为图片2]

线性回归相关函数实现

定义损失函数与梯度计算函数如下:

def cost_func(X, y, w, bias):
    y_pred = np.dot(X, w) + bias
    return np.mean((y_pred - y) ** 2)

def gradient_func(X, y, w, bias):
    n = X.shape[0]
    y_pred = np.dot(X, w) + bias
    dw = 2 / n * np.dot(X.T, (y_pred - y))
    db = 2 / n * np.sum(y_pred - y)
    return dw, db

[此处为图片3]
def gradient_descent(X, y, lr=1e-3, max_iter=10000, tolerance=1e-6):
    w = np.zeros((X.shape[1], 1))
    b = np.zeros((1, 1))
    for _ in range(max_iter):
        loss = cost_func(X, y, w, b)
        if loss < tolerance:
            return w, b
        dw, db = gradient_func(X, y, w, b)
        w -= lr * dw
        b -= lr * db
    return w, b

np.random.seed(0)
X = np.random.randn(100, 2)
true_w = np.array([[3.0], [-2.0]])
true_b = 5.0
y = np.dot(X, true_w) + true_b + 0.1 * np.random.rand(100, 1)
w_learned, b_learned = gradient_descent(X, y)
print(f'预测值w:\n{w_learned}')
print(f'预测值b:{b_learned}')

MAP(最大后验估计)的基本原理

最大后验估计(MAP)是在极大似然估计(MLE)的基础上,引入了参数的先验分布 P(θ)。其核心目标是最大化参数在给定数据下的后验概率:

P(θ | X) ∝ P(X | θ) P(θ)

取对数后,转化为优化问题:

log P(θ | X) = log P(X | θ) + log P(θ) + constant

因此,优化过程不仅依赖于数据的似然性,还需考虑参数的先验信息。例如,L2正则化可视为对权重施加高斯先验的一种体现。

适用场景分析

  • 在训练数据较少或稀疏的情况下,MAP能够借助先验知识有效防止模型过拟合。
  • 适用于需要融合经验数据与领域先验知识的任务,如贝叶斯网络构建、文本分类中的概率平滑处理等。
  • 典型应用包括贝叶斯线性回归、主题模型(如LDA)中超参数的学习与调整。

MLE 与 MAP 的对比及选择建议

极大似然估计(MLE)旨在寻找使观测数据出现概率最大的参数值,即最大化似然函数 f(x|θ) 中的 θ

而最大后验估计(MAP)假设参数本身服从某个先验分布 g(θ)。由于后验分布的分母为归一化常数且不依赖于 θ,因此只需最大化联合概率 f(x|θ)g(θ),所得结果即为后验分布的众数。

特别地,当参数的先验分布为均匀分布时,g(θ) 为常数,此时 MAP 的解与 MLE 完全一致。

主要区别

  1. 数据量影响: 在大数据条件下,MLE 与 MAP 的估计结果趋于一致;而在小样本情况下,MAP 凭借先验信息表现出更强的鲁棒性。
  2. 先验可用性: 若存在可靠的领域知识或物理约束作为先验,应优先采用 MAP 方法。
  3. 计算复杂度: MLE 通常计算更高效;而 MAP 需额外设计和处理先验分布,实现成本较高。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:最大似然估计 最大似然 似然估计 后验概率 Map

沙发
babylaugh 发表于 2025-12-8 18:18:55
点赞分享

藤椅
yiyijiayuan 在职认证  发表于 2025-12-9 14:52:59
简单路过。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-4-16 05:16