最大似然估计(MLE)和MAP(最大后验概率)
伯努利分布(Bernoulli Distribution)是概率论中一种离散概率分布,描述只有两种可能结果的单次随机试验。MLE的核心思想是找到使观测数据出现概率最大的参数值。的先验分布是均匀分布时,即先验分布为常数时,最大后验估计与最大似然估计重合,因为此时。优化时需同时考虑似然和先验的权重(如L2正则对应高斯先验)。通过优化算法(如梯度下降)求解使对数似然最大的参数。MAP在MLE的基础上引入
MLE和MAP
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=1∏nP(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=1∑nlogP(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=1∑nlogP(xi∣θ)=i=1∑nlog(p(xi)yi(1−p(xi))1−yi)=i∑n(yilog(pi)+(1−yi)log(1−pi))
等价于交叉熵损失函数:
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=1∑n[yilog(pi)+(1−yi)log(1−pi)]
其中: 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+e−z1,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+e−z)2e−z=(1+e−z)2(1+e−z)−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)] ∂w∂L(w)=−i=1∑nxi∗[yiσ(z)σ′(z)+(1−yi)1−σ(z)−σ′(z)]=−i=1∑nxi∗[yi(1−σ(z))−(1−yi)σ(z)]=−i=1∑nxi∗[yi−σ(z)]
即:(当存在多个参数时, w w w表示向量)
∂ L ∂ w = X T ( σ ( X w ) − y ) \frac{\partial L}{\partial w} = X^T(\sigma(Xw) - y) ∂w∂L=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需设计合理的先验分布。
更多推荐

所有评论(0)