本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见《机器学习数学通关指南》
似然函数是机器学习中参数估计的基石,它从数据与模型之间的关系出发,提供了一种优化参数的数学框架。
直观理解:假设你正在调整相机参数以拍摄最清晰的照片。似然函数就像是一个"清晰度指标",告诉你当前参数设置下能获得这张照片的可能性有多大。
对于参数 θ \theta θ 和观测数据 x = { x 1 , x 2 , . . . , x n } \mathbf{x} = \{x_1, x_2, ..., x_n\} x={x1,x2,...,xn},似然函数 L ( θ ∣ x ) L(\theta | \mathbf{x}) L(θ∣x) 表示在参数取值为 θ \theta θ 时观测到数据 x \mathbf{x} x 的可能性:
离散随机变量:
L ( θ ∣ x ) = P ( x ∣ θ ) = ∏ i = 1 n P ( X i = x i ∣ θ ) L(\theta | \mathbf{x}) = P(\mathbf{x}|\theta) = \prod_{i=1}^n P(X_i = x_i | \theta) L(θ∣x)=P(x∣θ)=∏i=1nP(Xi=xi∣θ)
连续随机变量:
L ( θ ∣ x ) = f ( x ∣ θ ) = ∏ i = 1 n f ( x i ∣ θ ) L(\theta | \mathbf{x}) = f(\mathbf{x}|\theta) = \prod_{i=1}^n f(x_i | \theta) L(θ∣x)=f(x∣θ)=∏i=1nf(xi∣θ)
其中 P P P 是概率质量函数, f f f 是概率密度函数。
概率函数 | 似然函数 |
---|---|
固定参数,变化数据 | 固定数据,变化参数 |
预测未来观测值 | 反推可能的参数值 |
积分/求和为1 | 无标准化约束 |
核心原则:在所有可能的参数值中,选择那个使得观测数据出现概率最大的参数值。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
from scipy.stats import norm
# 生成一些服从正态分布的数据
np.random.seed(42)
true_mean = 5
true_std = 2
data = np.random.normal(true_mean, true_std, size=100)
# 定义正态分布的负对数似然函数
def negative_log_likelihood(params):
mean, std = params
# 防止标准差为负
if std <= 0:
return 1e10
# 计算负对数似然
return -np.sum(norm.logpdf(data, mean, std))
# 使用优化方法找到最大似然估计值
initial_guess = [0, 1] # 初始猜测值
result = minimize(negative_log_likelihood, initial_guess)
mle_mean, mle_std = result.x
print(f"真实参数: 均值={true_mean}, 标准差={true_std}")
print(f"MLE估计: 均值={mle_mean:.4f}, 标准差={mle_std:.4f}")
极大似然估计 (MLE) | 最大后验估计 (MAP) | 完全贝叶斯推断 |
---|---|---|
θ ^ M L E = argmax θ L ( θ ∣ x ) \hat{\theta}_{MLE} = \underset{\theta}{\operatorname{argmax}} \, L(\theta|\mathbf{x}) θ^MLE=θargmaxL(θ∣x) | θ ^ M A P = argmax θ L ( θ ∣ x ) P ( θ ) \hat{\theta}_{MAP} = \underset{\theta}{\operatorname{argmax}} \, L(\theta|\mathbf{x})P(\theta) θ^MAP=θargmaxL(θ∣x)P(θ) | P ( θ ∣ x ) ∝ L ( θ ∣ x ) P ( θ ) P(\theta|\mathbf{x}) \propto L(\theta|\mathbf{x})P(\theta) P(θ∣x)∝L(θ∣x)P(θ) |
仅考虑似然 | 结合先验与似然 | 计算完整后验分布 |
点估计 | 点估计 | 分布估计 |
无超参数 | 需要先验超参数 | 需要先验超参数 |
逻辑回归:最大化条件似然函数
L ( θ ) = ∏ i = 1 n p ( y i ∣ x i , θ ) y i ⋅ ( 1 − p ( y i ∣ x i , θ ) ) 1 − y i L(\theta) = \prod_{i=1}^n p(y_i|x_i,\theta)^{y_i} \cdot (1-p(y_i|x_i,\theta))^{1-y_i} L(θ)=∏i=1np(yi∣xi,θ)yi⋅(1−p(yi∣xi,θ))1−yi,其中 p ( y ∣ x , θ ) = 1 1 + e − θ T x p(y|x,\theta) = \frac{1}{1+e^{-\theta^Tx}} p(y∣x,θ)=1+e−θTx1
线性回归:假设噪声服从正态分布,MLE等价于最小二乘法
θ ^ M L E = ( X T X ) − 1 X T y \hat{\theta}_{MLE} = (X^TX)^{-1}X^Ty θ^MLE=(XTX)−1XTy
高斯混合模型(GMM):使用EM算法求解隐变量模型的MLE
问题 | 解决方案 | 原理 |
---|---|---|
过拟合 | L1/L2正则化 | 等价于添加参数先验 |
数值问题 | 对数似然、梯度裁剪 | 避免数值下溢/上溢 |
多峰似然表面 | 多次随机初始化 | 跳出局部最优 |
计算效率 | 随机梯度下降(SGD) | 基于数据子集近似更新 |
假设从某二项分布 B ( n , p ) B(n,p) B(n,p) 中抽取样本,其中 n n n 已知,求 p p p 的MLE:
# 假设我们有20次试验,每次10个伯努利试验,记录成功次数
trials = 10
successes = [4, 5, 6, 3, 7, 5, 4, 6, 5, 6,
7, 5, 4, 3, 6, 5, 4, 5, 6, 5]
# MLE估计
p_mle = sum(successes) / (trials * len(successes))
print(f"成功概率的MLE估计: p = {p_mle:.4f}")
# 95%置信区间(使用正态近似)
import scipy.stats as stats
std_err = np.sqrt(p_mle * (1 - p_mle) / (trials * len(successes)))
ci_95 = stats.norm.interval(0.95, loc=p_mle, scale=std_err)
print(f"95%置信区间: ({ci_95[0]:.4f}, {ci_95:.4f})")
在生存分析中,假设时间服从指数分布 f ( t ∣ λ ) = λ e − λ t f(t|\lambda) = \lambda e^{-\lambda t} f(t∣λ)=λe−λt:
# 假设我们有一些生存时间数据(如设备故障时间)
survival_times = [2.5, 3.7, 0.5, 6.2, 4.1, 3.4, 2.8, 1.9, 5.6, 4.4]
# 指数分布的MLE估计
lambda_mle = 1 / np.mean(survival_times)
print(f"失效率参数λ的MLE估计: {lambda_mle:.4f}")
print(f"平均寿命(1/λ)的MLE估计: {1/lambda_mle:.4f}")
# 绘制数据与拟合分布
x = np.linspace(0, 10, 1000)
pdf_fitted = lambda_mle * np.exp(-lambda_mle * x)
plt.figure(figsize=(10, 6))
plt.hist(survival_times, bins=10, density=True, alpha=0.7, label='观测数据')
plt.plot(x, pdf_fitted, 'r-', linewidth=2, label=f'拟合指数分布(λ={lambda_mle:.4f})')
plt.xlabel('生存时间')
plt.ylabel('概率密度')
plt.legend()
plt.title('指数分布MLE拟合示例')
plt.grid(True, alpha=0.3)
plt.show()
在多变量数据分析中,对协方差矩阵的估计:
# 生成二元高斯分布数据
n_samples = 200
mean_true = np.array([1, 2])
cov_true = np.array([[2, 0.5], [0.5, 1]])
np.random.seed(42)
data = np.random.multivariate_normal(mean_true, cov_true, size=n_samples)
# MLE估计
mean_mle = np.mean(data, axis=0)
cov_mle = np.cov(data, rowvar=False)
print("真实均值向量:", mean_true)
print("MLE均值向量:", mean_mle)
print("\n真实协方差矩阵:")
print(cov_true)
print("\nMLE协方差矩阵:")
print(cov_mle)
# 可视化
plt.figure(figsize=(10, 6))
# 绘制数据点
plt.scatter(data[:, 0], data[:, 1], alpha=0.6)
# 添加真实均值与估计均值
plt.scatter(mean_true[0], mean_true, color='red', s=100, marker='*', label='真实均值')
plt.scatter(mean_mle[0], mean_mle, color='green', s=100, marker='+', label='MLE均值')
# 绘制95%置信椭圆
from matplotlib.patches import Ellipse
def plot_cov_ellipse(cov, pos, nstd=2, ax=None, **kwargs):
"""绘制协方差矩阵的置信椭圆"""
if ax is None:
ax = plt.gca()
vals, vecs = np.linalg.eigh(cov)
order = vals.argsort()[::-1]
vals = vals[order]
vecs = vecs[:, order]
theta = np.degrees(np.arctan2(*vecs[:, 0][::-1]))
width, height = 2 * nstd * np.sqrt(vals)
ellip = Ellipse(xy=pos, width=width, height=height, angle=theta, **kwargs)
return ax.add_patch(ellip)
# 绘制真实与估计的协方差椭圆
plot_cov_ellipse(cov_true, mean_true, nstd=2,
edgecolor='red', facecolor='none', label='真实协方差')
plot_cov_ellipse(cov_mle, mean_mle, nstd=2,
edgecolor='green', facecolor='none', label='MLE协方差')
plt.axis('equal')
plt.grid(True, alpha=0.3)
plt.legend()
plt.title('二元高斯分布MLE参数估计')
plt.show()
问题背景:在高维或小样本情况下,MLE容易过拟合
解决方法:添加惩罚项控制复杂度,类似于引入参数先验
当模型包含隐变量 z z z 时,直接优化似然函数 p ( x ∣ θ ) p(x|\theta) p(x∣θ) 变得困难。EM算法通过迭代优化来解决:
应用:GMM聚类、隐马尔可夫模型、主题模型等
对于复杂模型,可使用变分方法近似计算: