MLE(最大似然估计)原理

MLE的核心思想是找到使观测数据出现概率最大的参数值。假设数据独立同分布(i.i.d.),似然函数定义为:
L ( θ ) = ∏ i = 1 n P ( x i ∣ θ ) L(\theta) = \prod_{i=1}^n P(x_i \mid \theta) L(θ)=i=1nP(xiθ)
取对数后转化为对数似然函数:
log ⁡ L ( θ ) = ∑ i = 1 n log ⁡ P ( x i ∣ θ ) \log L(\theta) = \sum_{i=1}^n \log P(x_i \mid \theta) logL(θ)=i=1nlogP(xiθ)
通过优化算法(如梯度下降)求解使对数似然最大的参数 θ \theta θ

适用场景

  • 数据量充足时,MLE能收敛到真实参数。
  • 模型简单且无需考虑先验知识(如频率学派框架下的参数估计)。
  • 典型应用包括线性回归、逻辑回归的参数估计。

交叉熵损失

在逻辑回归(伯努利分布)的极大似然估计中,损失函数(负对数似然)的数学形式为:

  • 伯努利分布(Bernoulli Distribution)是概率论中一种离散概率分布,描述只有两种可能结果的单次随机试验。这两种结果通常称为“成功”和“失败”,分别用数值 1 和 0 表示。
    m a x log ⁡ L ( θ ) = ∑ i = 1 n log ⁡ P ( x i ∣ θ ) = ∑ i = 1 n l o g ( p ( x i ) y i ( 1 − p ( x i ) ) 1 − y i ) = ∑ i n ( y i l o g ( p i ) + ( 1 − y i ) l o g ( 1 − p i ) ) max\quad \log L(\theta) = \sum_{i=1}^n \log P(x_i \mid \theta)\\=\sum_{i=1}^{n}log\big(p(x_{i})^{y_{i}}(1-p(x_{i}))^{1-y_{i}}\big)\\=\sum_{i}^{n}\big(y_{i}log(p_{i})+(1-y_{i})log(1-p_{i})\big) maxlogL(θ)=i=1nlogP(xiθ)=i=1nlog(p(xi)yi(1p(xi))1yi)=in(yilog(pi)+(1yi)log(1pi))
    等价于交叉熵损失函数:
    m i n L ( w ) = − ∑ i = 1 n [ y i log ⁡ ( p i ) + ( 1 − y i ) log ⁡ ( 1 − p i ) ] min \quad L(w) = -\sum_{i=1}^n \left[ y_i \log(p_{i}) + (1-y_i)\log(1-p_{i}) \right] minL(w)=i=1n[yilog(pi)+(1yi)log(1pi)]

其中: p i = σ ( z ) = 1 1 + e − z , z = w x + b p_{i}=\sigma(z) = \frac{1}{1+e^{-z}},z=wx+b pi=σ(z)=1+ez1,z=wx+b 是sigmoid函数, X i X_i Xi 是第 i i i个样本的特征向量, y i y_i yi 是第i个样本的标签(0或1), w w w 是待求参数(包含偏置项)。

对损失函数求w的导数:( ∂ σ ( z ) ∂ z = e − z ( 1 + e − z ) 2 = ( 1 + e − z ) − 1 ( 1 + e − z ) 2 = σ ( z ) ( 1 − σ ( z ) \frac{\partial\sigma(z)}{\partial z}=\frac{e^{-z}}{(1+e^{-z})^{2}}=\frac{(1+e^{-z})-1}{(1+e^{-z})^{2}}=\sigma(z)(1-\sigma(z) zσ(z)=(1+ez)2ez=(1+ez)2(1+ez)1=σ(z)(1σ(z))
, ∂ σ ( z ) ∂ w = ∂ σ ( z ) ∂ z ∗ x , ∂ σ ( z ) ∂ b = ∂ σ ( z ) ∂ z \frac{\partial\sigma(z)}{\partial w}=\frac{\partial\sigma(z)}{\partial z}*x,\frac{\partial\sigma(z)}{\partial b}=\frac{\partial\sigma(z)}{\partial z} wσ(z)=zσ(z)x,bσ(z)=zσ(z)
∂ L ( w ) ∂ w = − ∑ i = 1 n x i ∗ [ y i σ ′ ( z ) σ ( z ) + ( 1 − y i ) − σ ′ ( z ) 1 − σ ( z ) ] = − ∑ i = 1 n x i ∗ [ y i ( 1 − σ ( z ) ) − ( 1 − y i ) σ ( z ) ] = − ∑ i = 1 n x i ∗ [ y i − σ ( z ) ] \frac{\partial L(w)}{\partial w}=-\sum_{i=1}^{n}x_{i}*[y_{i}\frac{\sigma'(z)}{\sigma(z)}+(1-y_{i})\frac{-\sigma'(z)}{1-\sigma(z)}]\\=-\sum_{i=1}^{n}x_{i}*[y_{i}(1-\sigma(z))-(1-y_{i})\sigma(z)]\\=-\sum_{i=1}^{n}x_{i}*[y_{i}-\sigma(z)] wL(w)=i=1nxi[yiσ(z)σ(z)+(1yi)1σ(z)σ(z)]=i=1nxi[yi(1σ(z))(1yi)σ(z)]=i=1nxi[yiσ(z)]
即:(当存在多个参数时, w w w表示向量)
∂ L ∂ w = X T ( σ ( X w ) − y ) \frac{\partial L}{\partial w} = X^T(\sigma(Xw) - y) wL=XT(σ(Xw)y)

逻辑回归梯度下降:

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)
# print(X_with_bias.shape,true_weights.shape,y.shape)

learned_weights, losses = gradient_descent(X_with_bias, y)

print("True weights:", true_weights)
print("Learned weights:", learned_weights)

线性回归:

import numpy as np
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 
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(\theta) P(θ),目标是最大化后验概率:
P ( θ ∣ X ) ∝ P ( X ∣ θ ) P ( θ ) P(\theta \mid X) \propto P(X \mid \theta) P(\theta) P(θX)P(Xθ)P(θ)
对数后验概率为:
log ⁡ P ( θ ∣ X ) = log ⁡ P ( X ∣ θ ) + log ⁡ P ( θ ) + constant \log P(\theta \mid X) = \log P(X \mid \theta) + \log P(\theta) + \text{constant} logP(θX)=logP(Xθ)+logP(θ)+constant
优化时需同时考虑似然和先验的权重(如L2正则对应高斯先验)。

适用场景

  • 数据稀疏时,利用先验知识避免过拟合。
  • 需平衡经验数据与领域知识(如贝叶斯网络、文本分类中的平滑处理)。
  • 典型应用包括贝叶斯线性回归、主题模型中的超参数调整。

对比与选择建议

  • 极大似然估计: θ \theta θ的最大似然估计是似然函数 f ( x ∣ θ ) f(x|\theta) f(xθ)取最大值时 θ \theta θ的值。
  • 最大后验估计:假设 θ \theta θ存在先验分布 g g g,并且由于后验分布的分母与 θ \theta θ无关,所以最大后验估计方法通过最大化 f ( x ∣ θ ) g ( θ ) f(x|\theta)g(\theta) f(xθ)g(θ)求得,即为其后验分布的众数。

值得注意的是,当 θ \theta θ的先验分布是均匀分布时,即先验分布为常数时,最大后验估计与最大似然估计重合,因为此时 g ( θ ) g(\theta) g(θ)的值与 θ \theta θ取值无关。

区别:

  • 数据量:大数据下MLE与MAP结果趋近;小数据时MAP更鲁棒。
  • 先验信息:若有可靠先验(如物理模型约束),优先选择MAP。
  • 计算成本:MLE通常更高效,MAP需设计合理的先验分布。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐