机器学习-极大似然估计

2024-09-30  本文已影响0人  阿凡提说AI

极大似然估计详解

极大似然估计 (Maximum Likelihood Estimation,MLE) 是统计学中常用的参数估计方法,用于根据样本数据来估计模型参数,使得模型能够最大程度地解释观测到的数据。

1. 基本原理

假设我们有一个随机变量 X,其概率分布由参数 θ 控制,例如正态分布的均值和方差。现在,我们得到了来自该分布的 n 个样本数据 X1, X2, ..., Xn。极大似然估计的目标就是找到参数 θ 的估计值 θ̂,使得在该参数下,观测到这 n 个样本数据的概率最大。

换句话说,极大似然估计就是寻找一个参数 θ,使得它能够最大程度地解释观测到的样本数据。

2. 核心公式

极大似然估计的核心公式如下:

θ̂ = argmax(L(θ; X1, X2, ..., Xn))

其中:

3. 算法步骤

  1. 构建似然函数: 根据数据分布和参数 θ,构建似然函数 L(θ; X1, X2, ..., Xn)。
  2. 求导: 对似然函数求关于参数 θ 的导数,得到导数函数 ∂L(θ; X1, X2, ..., Xn) / ∂θ。
  3. 解方程: 将导数函数设为 0,并解方程,求得参数 θ 的估计值 θ̂。

4. 例子:估计正态分布的均值和方差

假设我们有 n 个样本数据 X1, X2, ..., Xn,它们来自均值为 μ、方差为 σ² 的正态分布。

1. 构建似然函数:

L(μ, σ²; X1, X2, ..., Xn) = ∏(1 / (σ√(2π)) * exp(-(Xi - μ)² / (2σ²)))

2. 求导:

对似然函数求关于 μ 和 σ² 的偏导数,得到导数函数:

∂L / ∂μ = ∑((Xi - μ) / σ²)
∂L / ∂σ² = -n / (2σ²) + ∑((Xi - μ)² / (2σ⁴))

3. 解方程:

将导数函数设为 0,解方程得到参数 μ 和 σ² 的估计值:

μ̂ = (∑Xi) / n
σ̂² = (∑(Xi - μ̂)²) / n

5. 优缺点

优点:

缺点:

6. 总结

极大似然估计是一种简单有效的参数估计方法,在许多实际问题中都有广泛的应用。但需要注意其适用范围和局限性,并结合其他方法来进行参数估计。

7. 其他说明

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize

# 生成模拟数据
np.random.seed(42)
data = np.random.normal(loc=5, scale=2, size=100)

# 定义似然函数
def likelihood(params, data):
    """
    计算似然函数值。

    Args:
        params: 参数列表,包含均值 mu 和 标准差 sigma
        data: 观测数据

    Returns:
        似然函数值
    """
    mu, sigma = params
    return 1 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-(data - mu)**2 / (2 * sigma**2))

# 定义负对数似然函数
def negative_log_likelihood(params, data):
    """
    计算负对数似然函数值。

    Args:
        params: 参数列表,包含均值 mu 和 标准差 sigma
        data: 观测数据

    Returns:
        负对数似然函数值
    """
    return -np.sum(np.log(likelihood(params, data)))

# 使用最小化函数寻找参数
initial_guess = [0, 1]  # 初始化参数
result = minimize(negative_log_likelihood, initial_guess, args=(data,))

# 获取最大似然估计参数
mu_hat, sigma_hat = result.x

# 打印结果
print(f"估计的均值: {mu_hat}")
print(f"估计的标准差: {sigma_hat}")

# 可视化结果
plt.hist(data, bins=20, density=True, alpha=0.5, label="数据分布")
x = np.linspace(data.min() - 1, data.max() + 1, 100)
y = 1 / (sigma_hat * np.sqrt(2 * np.pi)) * np.exp(-(x - mu_hat)**2 / (2 * sigma_hat**2))
plt.plot(x, y, label="最大似然估计的正态分布")
plt.legend()
plt.title("最大似然估计结果")
plt.show()
上一篇下一篇

猜你喜欢

热点阅读