Skip to content

统计学基础

统计学提供了描述数据和量化不确定性的语言。本章涵盖分布、随机变量、PMF、PDF、CDF、期望、方差、矩以及中心极限定理,这些概念是机器学习中每个评估指标和损失函数的基础。

  • 统计学是从数据中学习的科学。你收集观测值,对其进行总结,并得出结论,通常涉及无法直接测量的事物。

  • 想象你想知道一个国家所有成年人的平均身高。你无法测量每个人,因此你测量一个样本,并利用统计学对整个总体做出有根据的估计。

  • 统计学有两个主要分支:

    • 描述统计:总结已有的数据(平均值、图表、表格)
    • 推断统计:利用样本对更大的群体做出推断
  • 统计学的基本构件是分布,它描述了数值是如何散布的。其他一切——平均值、检验、预测——都源于对分布的理解。

  • 频率分布统计每个值(或数值区间)在数据中出现的次数。想象将考试成绩分箱,并统计每个箱中有多少学生。结果就是直方图。

  • 概率分布将原始计数替换为概率。不再说“12名学生的分数在70到80分之间”,而是说“分数落在70到80分之间的概率是0.24”。当数据是连续时,直方图的条形变成一条光滑曲线。

频率分布(直方图)与概率分布(光滑曲线)的对比

  • 左边的直方图是根据你实际收集的数据构建的。右边的光滑曲线是描述数据背后模式的数学模型。一个是经验的,另一个是理论的。

  • 要想用数学方式处理分布,我们需要一种将结果赋值为数字的方法。这正是随机变量所做的。

  • 随机变量是一个函数,它将实验的每个结果映射到一个实数。抛一枚硬币:结果是“正面”或“反面”,但随机变量 \(X\) 将其转换为 \(X(\text{正面}) = 1\)\(X(\text{反面}) = 0\)。现在我们可以进行算术运算了。

随机变量将结果(硬币、骰子)映射到数轴上

  • 离散型随机变量取可数多个值:10次抛掷中正面的次数、掷骰子的结果、一小时内收到的电子邮件数量。

  • 连续型随机变量可以取区间内的任何值:你的确切身高、下一辆公交车到达的时间、正午的温度。

  • 这种区别很重要,因为它改变了我们计算概率的方式。对于离散变量,我们求和。对于连续变量,我们积分(回顾第3章的积分)。

  • 对于离散随机变量,概率质量函数(PMF) 给出每个具体值的概率:

\[P(X = x) = p(x), \quad \text{其中 } \sum_{x} p(x) = 1\]
  • 对于连续随机变量,概率密度函数(PDF) 给出落在一个范围内的概率。任何单个精确值的概率为零;只有区间具有正概率:
\[P(a \le X \le b) = \int_a^b f(x)\, dx, \quad \text{其中 } \int_{-\infty}^{\infty} f(x)\, dx = 1\]
  • 既然我们可以给结果赋予数值,最自然的问题就是:我们平均期望什么值?

  • 期望(或期望值)是所有可能值的加权平均,其中权重是概率。可以把它想象成分布的“重心”。

  • 如果你多次掷一个公平骰子,你的平均点数会收敛到3.5。这就是期望值,尽管你实际上永远掷不出3.5。

  • 对于离散随机变量:

\[E[X] = \sum_{x} x \cdot p(x)\]
  • 对于连续随机变量(使用第3章的积分):
\[E[X] = \int_{-\infty}^{\infty} x \cdot f(x)\, dx\]
  • 例如:一个公平的六面骰子,对于 \(x = 1, 2, 3, 4, 5, 6\)\(p(x) = 1/6\)
\[E[X] = 1 \cdot \tfrac{1}{6} + 2 \cdot \tfrac{1}{6} + 3 \cdot \tfrac{1}{6} + 4 \cdot \tfrac{1}{6} + 5 \cdot \tfrac{1}{6} + 6 \cdot \tfrac{1}{6} = \frac{21}{6} = 3.5\]
  • 期望是线性的,即 \(E[aX + b] = aE[X] + b\)。这个性质非常有用,在机器学习损失函数中不断出现。

  • 期望告诉我们中心位置,但没有说明数值的分散程度。要描述分布的全貌,我们需要

  • 矩是 \(X\) 的幂的期望。\(k\)原点矩为:

\[\mu_k' = E[X^k]\]
  • 一阶原点矩(\(k = 1\))就是均值:\(\mu_1' = E[X] = \mu\)

  • 原点矩是从零开始测量的。我们常常更关心相对于均值的偏差。\(k\)中心矩将测量中心化:

\[\mu_k = E[(X - \mu)^k]\]
  • 一阶中心矩始终为零(均值上下的偏差相互抵消)。二阶中心矩就是方差

  • 为了比较不同尺度下的分布,我们通过除以标准差 \(\sigma\) 的适当幂次来进行标准化

\[\tilde{\mu}_k = \frac{\mu_k}{\sigma^k}\]
  • 每个矩捕捉分布形状的不同方面:

标注了每个矩所捕捉特征的钟形曲线:均值(中心)、方差(分散度)、偏度(不对称性)、峰度(尾部权重)

  • 一阶矩(均值):分布的中心位置。平衡点。
  • 二阶矩(方差):数值围绕均值的分散程度。方差越大,分布越宽。
  • 三阶矩(偏度):分布向左还是向右偏斜。偏度为零意味着对称。
  • 四阶矩(峰度):尾部的重量。峰度越高,意味着更多的极端离群值。

  • 让我们针对一个具体的数据集计算所有四个矩:\(X = \{2, 4, 4, 4, 5, 5, 7, 9\}\)

  • 第 1 步:均值(一阶原点矩)

\[\mu = \frac{2 + 4 + 4 + 4 + 5 + 5 + 7 + 9}{8} = \frac{40}{8} = 5\]
  • 第 2 步:方差(二阶中心矩)。从每个值中减去均值,取平方,然后平均:
\[\sigma^2 = \frac{(2{-}5)^2 + (4{-}5)^2 + (4{-}5)^2 + (4{-}5)^2 + (5{-}5)^2 + (5{-}5)^2 + (7{-}5)^2 + (9{-}5)^2}{8}\]
\[= \frac{9 + 1 + 1 + 1 + 0 + 0 + 4 + 16}{8} = \frac{32}{8} = 4\]
  • 标准差\(\sigma = \sqrt{4} = 2\)

  • 第 3 步:偏度(标准化的三阶中心矩)。对偏差取立方,平均,再除以 \(\sigma^3\)

\[\tilde{\mu}_3 = \frac{1}{8} \cdot \frac{(-3)^3 + (-1)^3 + (-1)^3 + (-1)^3 + 0^3 + 0^3 + 2^3 + 4^3}{2^3}\]
\[= \frac{1}{8} \cdot \frac{-27 -1 -1 -1 + 0 + 0 + 8 + 64}{8} = \frac{42}{64} = 0.656\]
  • 正偏度意味着右侧尾部更长,这符合直觉,因为9远高于均值。

  • 第 4 步:峰度(标准化的四阶中心矩)。将偏差提升到四次方:

\[\tilde{\mu}_4 = \frac{1}{8} \cdot \frac{(-3)^4 + (-1)^4 + (-1)^4 + (-1)^4 + 0^4 + 0^4 + 2^4 + 4^4}{2^4}\]
\[= \frac{1}{8} \cdot \frac{81 + 1 + 1 + 1 + 0 + 0 + 16 + 256}{16} = \frac{356}{128} = 2.781\]
  • 正态分布的峰度为3(称为“常峰态”)。我们的值2.781接近,表明尾部大致正常。高于3的值(“尖峰态”)表示更重的尾部;低于3(“低峰态”)表示更轻的尾部。某些公式通过减去3来报告超额峰度,因此我们的超额峰度为 \(-0.219\)

编程任务(使用 CoLab 或 notebook)

  1. 计算一个灌铅骰子的期望值,其中面6的概率为0.3,其余面平分剩余概率。通过模拟100,000次投掷进行验证。

    import jax
    import jax.numpy as jnp
    
    # 灌铅骰子:面6的概率为0.3,其余面平分0.7
    probs = jnp.array([0.14, 0.14, 0.14, 0.14, 0.14, 0.30])
    faces = jnp.array([1, 2, 3, 4, 5, 6])
    
    # 解析期望值
    ev = jnp.sum(faces * probs)
    print(f"期望值(公式): {ev:.4f}")
    
    # 模拟
    key = jax.random.PRNGKey(42)
    rolls = jax.random.choice(key, faces, shape=(100_000,), p=probs)
    print(f"期望值(模拟): {rolls.mean():.4f}")
    

  2. 计算工作示例中数据集的全部四个矩(均值、方差、偏度、峰度),然后修改数据并观察每个矩如何变化。

    import jax.numpy as jnp
    
    x = jnp.array([2, 4, 4, 4, 5, 5, 7, 9], dtype=jnp.float32)
    
    mean = jnp.mean(x)
    variance = jnp.mean((x - mean) ** 2)
    std = jnp.sqrt(variance)
    skewness = jnp.mean(((x - mean) / std) ** 3)
    kurtosis = jnp.mean(((x - mean) / std) ** 4)
    
    print(f"均值:     {mean:.3f}")
    print(f"方差: {variance:.3f}")
    print(f"标准差:  {std:.3f}")
    print(f"偏度: {skewness:.3f}")
    print(f"峰度: {kurtosis:.3f}")
    print(f"超额峰度: {kurtosis - 3:.3f}")
    

  3. 并排可视化公平骰子投掷的PMF和CDF。尝试更改概率,观察形状如何变化。

    import jax.numpy as jnp
    import matplotlib.pyplot as plt
    
    faces = jnp.array([1, 2, 3, 4, 5, 6])
    pmf = jnp.ones(6) / 6  # 公平骰子;尝试修改这些概率!
    cdf = jnp.cumsum(pmf)
    
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
    
    ax1.bar(faces, pmf, color="#3498db", alpha=0.8)
    ax1.set_title("PMF")
    ax1.set_xlabel("点数")
    ax1.set_ylabel("P(X = x)")
    ax1.set_ylim(0, 0.5)
    
    ax2.step(faces, cdf, where="mid", color="#e74c3c", linewidth=2)
    ax2.set_title("CDF")
    ax2.set_xlabel("点数")
    ax2.set_ylabel("P(X ≤ x)")
    ax2.set_ylim(0, 1.1)
    
    plt.tight_layout()
    plt.show()