ML 学习站
跳到正文

正态分布

正态分布性质、z 分数、68-95-99.7 法则、查表。

35 分钟1 / 23,012
加载中...

正态分布(Normal/Gaussian Distribution)是统计学和机器学习中至关重要的概念,广泛应用于描述自然现象和误差分布。本章首先介绍了正态分布的重要性,指出它是许多独立小因素叠加的极限形态(中心极限定理),因此在描述身高、考试成绩、测量误差等方面具有普适性。接着,章节详细阐述了正态分布的数学定义,包括均值(μ)和标准差(σ)两个参数及其对分布形态的影响。标准正态分布(Z)通过标准化过程将任何正态分布转化为均值为0、标准差为1的通用形式,便于查表计算。68-95-99.7法则是正态分布的重要经验法则,描述了数据在均值附近不同标准差范围内的概率分布。章节还探讨了正态分布的常见应用场景,如线性回归中的残差假设、高斯朴素贝叶斯中的特征条件概率等,并介绍了正态性检验方法(如Shapiro-Wilk、D'Agostino K²等)以及异常值对正态性检验的影响。最后,章节通过Python实战演示了如何生成正态分布样本、绘制直方图、进行正态性检验以及观察异常值的影响。读者学完后,将能够理解正态分布的基本原理和应用场景,掌握正态性检验方法,并在机器学习模型中正确应用正态分布假设。

正态分布

本章问题: 全世界成年人的身高、考试成绩、测量误差, 全都近似服从正态分布。为什么? 因为它是许多独立小因素叠加的极限形态 (中心极限定理)。这意味着 ML 几乎所有"线性模型"都默认它。

1. 为什么正态分布这么重要?

正态分布 (Normal / Gaussian) 出现在几乎所有地方:

  • 人的身高、体重、血压
  • 考试分数 (很多题, 每题小影响)
  • 测量误差 (很多微小因素)
  • 工厂零件尺寸 (机器 + 材料微小变化)
  • 股票日收益 (大量买卖者)

💡 历史趣闻: 高斯用它预测谷神星的位置, 误差最小, 一战成名。数学家 Galton 把它说成"统治宇宙的神秘秩序"。

2. 正态分布的数学定义

参数含义影响
μ (均值)分布中心整体平移
σ (标准差)分布"胖瘦"越胖越散, 越瘦越集中
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

x = np.linspace(-5, 5, 200)
fig, axes = plt.subplots(1, 2, figsize=(12, 4))

# 左图: 不同 μ, 同 σ
for mu in [-2, 0, 2]:
    axes[0].plot(x, norm.pdf(x, mu, 1), label=f"μ={mu}, σ=1")
axes[0].set_title("不同 μ (均值)"); axes[0].legend()

# 右图: 同 μ, 不同 σ
for sigma in [0.5, 1, 2]:
    axes[1].plot(x, norm.pdf(x, 0, sigma), label=f"μ=0, σ={sigma}")
axes[1].set_title("不同 σ (标准差)"); axes[1].legend()
plt.show()

3. 标准正态分布 (Z)

为了"通用化", 把 X 标准化成 Z = (X - μ) / σ, 得到标准正态:

任何正态分布都可以转化为标准正态 (反之亦然), 所以查表只需要查 Z 表。

from scipy.stats import norm
# 例: X ~ N(170, 10²), 问 X > 185 的概率
mu, sigma = 170, 10
x = 185
z = (x - mu) / sigma  # = 1.5
p = 1 - norm.cdf(z)
print(f"z = {z}, P(X > 185) = {p:.3f}")
# z = 1.5, P ≈ 0.067

4. 68-95-99.7 法则 (经验法则)

如果 X ~ N(μ, σ²), 那么:

区间概率
(μ - σ, μ + σ)68.27%
(μ - 2σ, μ + 2σ)95.45%
(μ - 3σ, μ + 3σ)99.73%
(μ - 1.96σ, μ + 1.96σ)95% ← 常用置信度
(μ - 2.58σ, μ + 2.58σ)99%

这就是为什么 ±3σ 经常被当作"异常值阈值"。

from scipy.stats import norm
# 验证
print(f"±1σ: {norm.cdf(1) - norm.cdf(-1):.4f}")   # 0.6827
print(f"±2σ: {norm.cdf(2) - norm.cdf(-2):.4f}")   # 0.9545
print(f"±3σ: {norm.cdf(3) - norm.cdf(-3):.4f}")   # 0.9973
print(f"±1.96σ: {norm.cdf(1.96) - norm.cdf(-1.96):.4f}")  # 0.95

5. 正态分布的常见问题

5.1 已知概率, 求临界值

某考试分数 X ~ N(500, 100²), 排名前 10% 需要多少分?

from scipy.stats import norm
mu, sigma = 500, 100
# 前 10% → P(X > x) = 0.10 → P(X ≤ x) = 0.90
x = norm.ppf(0.90, mu, sigma)
print(f"前 10% 至少需要 {x:.0f} 分")  # ≈ 628

5.2 两个正态组合

男性身高 N(175, 7²), 女性 N(162, 6²)。聚会男女各半, 随机选一人, 身高 > 175 的概率?

# 全概率公式
p_male = p_female = 0.5
p_tall_male = 1 - norm.cdf(175, 175, 7)        # 男 > 175
p_tall_female = 1 - norm.cdf(175, 162, 6)      # 女 > 175
p_tall = p_male * p_tall_male + p_female * p_tall_female
print(f"P(身高 > 175) = {p_tall:.3f}")

5.3 正态近似二项

当 n 大, p 不接近 0/1 时, B(n, p) ≈ N(np, np(1-p))

from scipy.stats import binom, norm
n, p = 100, 0.5
# 准确: P(40 ≤ X ≤ 60)
p_exact = binom.cdf(60, n, p) - binom.cdf(39, n, p)
# 近似
mu = n * p
sigma = np.sqrt(n * p * (1 - p))
p_approx = norm.cdf(60.5, mu, sigma) - norm.cdf(39.5, mu, sigma)  # 连续性修正
print(f"二项精确: {p_exact:.4f}, 正态近似: {p_approx:.4f}")  # ≈ 0.965

6. 什么时候数据不是正态?

正态分布的"失败模式":

  • 有界数据: 占比 (0-1)、考试分数 (0-100)
  • 偏态数据: 收入、点击数 (右偏)、反应时间 (右偏)
  • 重尾数据: 金融收益、互联网流量
  • 多峰数据: 混合分布 (男性+女性身高)
# 看是否正态: Q-Q 图
import scipy.stats as stats
import numpy as np

# 模拟 3 种分布
np.random.seed(42)
normal_data = np.random.normal(0, 1, 1000)
skewed_data = np.random.exponential(2, 1000)
bimodal_data = np.concatenate([np.random.normal(-2, 1, 500),
                                np.random.normal(2, 1, 500)])

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
for ax, data, title in zip(axes,
    [normal_data, skewed_data, bimodal_data],
    ["正态 (QQ 在直线上)", "右偏 (QQ 弯)", "双峰 (QQ S 形)"]):
    stats.probplot(data, dist="norm", plot=ax)
    ax.set_title(title)
plt.tight_layout(); plt.show()

7. Python 实战: 真实数据正态性检验

import numpy as np
from scipy import stats

# 1. Shapiro-Wilk 检验 (n < 5000 推荐)
data = np.random.normal(0, 1, 500)
stat, p = stats.shapiro(data)
print(f"Shapiro: stat={stat:.4f}, p={p:.4f}")
# p > 0.05 → 不能拒绝正态性假设

# 2. D'Agostino K² 检验 (大样本)
stat, p = stats.normaltest(data)
print(f"D'Agostino: stat={stat:.4f}, p={p:.4f}")

# 3. Anderson-Darling 检验
result = stats.anderson(data, dist="norm")
print(f"Anderson-Darling: stat={result.statistic:.4f}")
print(f"  临界值: {result.critical_values} (5%: {result.critical_values[2]})")
检验适用优点
Shapiro-Wilk小样本 (n < 5000)检验力最强
D'Agostino K²中大样本兼顾偏度+峰度
Anderson-Darling任何重视尾部
Kolmogorov-Smirnov任何也可检验其他分布

8. ML 中的正态分布

场景角色
线性回归假设残差 ~ N(0, σ²)
高斯朴素贝叶斯特征条件概率 P(x|y) ~ N(μ_y, σ_y²)
LDA 主题模型隐变量先验是高斯
异常检测|z| > 3 → 异常
神经网络初始化权重 ~ N(0, σ²) (Xavier/He)
变分自编码器隐空间 ~ N(0, I)
扩散模型每步加 N(0, σ²) 噪声
Dropout隐式给输出加近似高斯噪声

9. 小结

你学到了关键点
正态分布f(x) = ..., 钟形, 对称
标准正态Z = (X-μ)/σ, 通用查表
68-95-99.71σ 68%, 2σ 95%, 3σ 99.7%
临界值问题norm.ppf(0.95)
正态近似二项n 大 p 不极端时, B(n,p) ≈ N(np, np(1-p))
正态性检验Shapiro / D'Agostino / Anderson / QQ 图
ML 角色几乎所有线性/概率模型都假设它

10. 习题

  1. 一考试分数 X ~ N(72, 8²):

    • 求 P(X > 80)
    • 求 P(60 < X < 80)
    • 求前 5% 的分数线
    • 90 分以上算优秀, 优秀率多少?
  2. np.random.normal(0, 1, 1000) 生成 1000 个样本:

    • 画直方图叠加理论正态曲线
    • 做 Shapiro-Wilk 检验
    • 把 1 个值改成 100 (注入异常值), 重新画图 + 检验, 观察变化
👉 查看参考答案
  1. 计算:

    • P(X > 80) = P(Z > 1) = 1 - Φ(1) ≈ 0.1587
    • P(60 < X < 80) = P(-1.5 < Z < 1) = Φ(1) - Φ(-1.5) ≈ 0.7745
    • 前 5% 分数线: μ + 1.645σ = 72 + 1.645 × 8 ≈ 85.2
    • 优秀率 P(X > 90) = P(Z > 2.25) ≈ 0.0122
  2. 提示: 注入异常值后, 直方图右边出现一根"长刺", Shapiro 检验 p 值会骤降 → 拒绝正态。这演示了异常值对正态性检验的影响

11. 下一章


📚 本章来源: 改编自 Triola《基础统计学》第 14 版 第 6 章 6-1、6-2 节, 加入 ML 模型中的正态假设。

章末小测验

检验你对《正态分布》的掌握程度。

1

正态分布的数学定义中,参数μ和σ分别代表什么?

2

以下哪些情况的数据可能不服从正态分布?

3

正态分布的68-95-99.7法则指的是什么?

4

在ML模型中,哪些场景假设数据服从正态分布?

5

以下哪些检验方法适用于正态性检验?

讨论区(0)

加载评论中...