正态分布 - 正态分布的标准化
正态分布 - 正态分布的标准化
flyfish
完整代码在文末
正态分布的标准化
在概率论与数理统计中,正态分布(Normal distribution) 又称为高斯分布(Gaussian distribution),其概率密度函数呈现著名的 钟形曲线(bell curve)。正态分布不仅是数学上的一个重要概率分布,更是自然科学与社会科学中最常见的统计模型之一。
人们发现,在大量随机现象中,数据往往并不是均匀分布的,而是集中在某个平均值附近,并逐渐向两侧减少,形成对称的钟形模式。正态分布恰好能精确刻画这种现象。
其概率密度函数(PDF)为:
f(x)=1σ2πexp(−(x−μ)22σ2)f(x) = \frac{1}{\sigma \sqrt{2\pi}} \exp\left( -\frac{(x - \mu)^2}{2\sigma^2} \right)f(x)=σ2π1exp(−2σ2(x−μ)2)
其中,μ\muμ 是均值(mean),表示分布的中心位置;σ\sigmaσ 是标准差(standard deviation),衡量数据的离散程度;σ2\sigma^2σ2 是方差(variance)。
标准化(standardization)是将一个任意正态分布转换为标准正态分布(Standard Normal Distribution)的过程。标准正态分布是均值为0、标准差为1的特殊正态分布,即 Z∼N(0,1)Z \sim N(0, 1)Z∼N(0,1),其PDF简化为:
ϕ(z)=12πexp(−z22)\phi(z) = \frac{1}{\sqrt{2\pi}} \exp\left( -\frac{z^2}{2} \right)ϕ(z)=2π1exp(−2z2)
标准化过程的核心是通过线性变换,使原始分布的均值移到0,方差缩放到1,从而便于计算概率、比较不同分布,并利用标准正态表(Z表)进行统计推断。
1. 标准化过程的数学原理
假设有一个随机变量 X∼N(μ,σ2)X \sim N(\mu, \sigma^2)X∼N(μ,σ2)。标准化通过以下变换得到标准正态变量 ZZZ:
Z=X−μσZ = \frac{X - \mu}{\sigma}Z=σX−μ
-
为什么这个变换有效?
- 减去均值 μ\muμ:这将分布的中心从 μ\muμ 平移到0,即 E[Z]=E[X−μσ]=E[X]−μσ=μ−μσ=0E[Z] = E\left[\frac{X - \mu}{\sigma}\right] = \frac{E[X] - \mu}{\sigma} = \frac{\mu - \mu}{\sigma} = 0E[Z]=E[σX−μ]=σE[X]−μ=σμ−μ=0。
- 除以标准差 σ\sigmaσ:这将方差缩放到1,即 Var(Z)=Var(X−μσ)=Var(X)σ2=σ2σ2=1Var(Z) = Var\left(\frac{X - \mu}{\sigma}\right) = \frac{Var(X)}{\sigma^2} = \frac{\sigma^2}{\sigma^2} = 1Var(Z)=Var(σX−μ)=σ2Var(X)=σ2σ2=1。
正态分布在仿射变换(affine transformation,即线性变换加常数)下保持正态性。这是一个关键性质:如果 XXX 是正态的,则 aX+baX + baX+b 也是正态的,其中 a≠0a \neq 0a=0。在这里,a=1/σa = 1/\sigmaa=1/σ,b=−μ/σb = -\mu/\sigmab=−μ/σ,因此 ZZZ 仍是正态分布,且参数为 N(0,1)N(0, 1)N(0,1)。
-
证明标准化后的分布是标准正态:
考虑 ZZZ 的累积分布函数(CDF):FZ(z)=P(Z≤z)=P(X−μσ≤z)=P(X≤μ+zσ)=FX(μ+zσ)F_Z(z) = P(Z \leq z) = P\left( \frac{X - \mu}{\sigma} \leq z \right) = P(X \leq \mu + z\sigma) = F_X(\mu + z\sigma)FZ(z)=P(Z≤z)=P(σX−μ≤z)=P(X≤μ+zσ)=FX(μ+zσ)
其中 FXF_XFX 是 XXX 的CDF。将 XXX 的PDF代入,并求导得到 ZZZ 的PDF,即可验证它符合 N(0,1)N(0,1)N(0,1) 的形式。详细推导涉及变量替换:在积分中,让 u=(x−μ)/σu = (x - \mu)/\sigmau=(x−μ)/σ,则 dx=σdudx = \sigma dudx=σdu,代入后指数部分简化为 −u2/2-u^2/2−u2/2,常数项为 1/2π1/\sqrt{2\pi}1/2π。
2. 标准化过程的详细步骤
要将任意正态分布转换为标准正态分布,遵循以下步骤:
-
确定原始分布的参数:
- 计算或已知均值 μ\muμ 和标准差 σ\sigmaσ。如果是从样本数据计算,则 μ\muμ 是样本均值 xˉ\bar{x}xˉ,σ\sigmaσ 是样本标准差 s=1n−1∑(xi−xˉ)2s = \sqrt{\frac{1}{n-1} \sum (x_i - \bar{x})^2}s=n−11∑(xi−xˉ)2(对于总体,用 nnn 分母)。
-
计算Z分数(Z-score):
- 对于每个观测值 xxx,计算 z=x−μσz = \frac{x - \mu}{\sigma}z=σx−μ。
- 这将每个 xxx 转换为对应的 zzz 值,表示 xxx 偏离均值的标准差倍数。正值表示高于均值,负值表示低于均值。
-
验证转换:
- 新变量 ZZZ 的分布应为 N(0,1)N(0,1)N(0,1)。可以通过绘制直方图或使用正态性检验(如Shapiro-Wilk测试)验证。
-
利用标准正态表或软件计算概率:
- 一旦转换为 ZZZ,可以使用Z表查找概率。例如,P(Z ≤ 1.96) ≈ 0.975。
- 在软件中,如Python的scipy.stats.norm.cdf(z)。
3. 为什么需要标准化?重要性和应用
标准化不是简单的数值变换,它有深刻的实际意义:
- 统一比较:不同正态分布的尺度不同(例如,一个分布单位是厘米,另一个是英寸)。标准化后,所有分布都在同一“Z尺度”上,便于比较。例如,在教育中,标准化考试分数(如SAT)允许跨年份或群体比较。
- 简化计算:标准正态分布有现成的表格和函数库,避免为每个分布单独积分PDF。中心极限定理(CLT)也依赖于此:样本均值的分布趋近正态,经标准化后可直接用Z统计量。
- 统计推断:
- 置信区间:例如,95%置信区间为 xˉ±1.96σn\bar{x} \pm 1.96 \frac{\sigma}{\sqrt{n}}xˉ±1.96nσ,其中1.96来自Z=1.96的百分位。
- 假设检验:Z检验用于检验均值假设,如 Z=xˉ−μ0σ/nZ = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}}Z=σ/nxˉ−μ0,然后与临界值比较。
- 异常检测:Z > 3 或 Z < -3 表示数据超出99.7%的范围(根据经验法则),可能为异常值。
- 机器学习:在特征工程中,标准化数据(如sklearn的StandardScaler)使模型(如神经网络)收敛更快,避免特征尺度差异影响。金融风险评估(VaR模型)、质量控制(六西格玛,使用±3σ阈值)、心理学(IQ分数标准化为均值100、SD15)。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm# 参数设置:左侧正态分布
mu_left = 1010
sigma_left = 20# 右侧标准正态
mu_right = 0
sigma_right = 1# 生成x值,确保范围足够宽以显示完整曲线
x_left = np.linspace(950 - 10, 1070 + 10, 1000) # 略微扩展以防边缘裁剪
pdf_left = norm.pdf(x_left, mu_left, sigma_left)x_right = np.linspace(-3.5, 3.5, 1000)
pdf_right = norm.pdf(x_right, mu_right, sigma_right)# 创建画布
fig, ax = plt.subplots(figsize=(14, 6)) #左侧用柔和的绿色渐变,右侧用蓝色渐变
# 绘制左侧曲线(柔和绿色)
ax.plot(x_left, pdf_left, color='darkgreen', linewidth=2)
ax.fill_between(x_left, pdf_left, color='#98FB98', alpha=0.9) # PaleGreen# 绘制右侧曲线(蓝色),向右平移并匹配高度
shift = 160 # 略微增加shift以更好地分离两个图
height_scale = max(pdf_left) / max(pdf_right) # 高度匹配
ax.plot(x_right * sigma_left + mu_left + shift, pdf_right * height_scale, color='navy', linewidth=2)
ax.fill_between(x_right * sigma_left + mu_left + shift, pdf_right * height_scale, color='#87CEEB', alpha=0.9) # SkyBlue# 添加左侧x轴标签
left_labels = [950, 970, 990, 1010, 1030, 1050, 1070]
for label in left_labels:ax.text(label, -0.0015, str(label), ha='center', fontsize=11, color='black') # 降低y位置以清晰可见# 添加右侧x轴标签(转换为z-score对应位置)
right_labels = [-3, -2, -1, 0, 1, 2, 3]
for i, label in enumerate(right_labels):pos = mu_left + shift + label * sigma_leftax.text(pos, -0.0015, f'{label:+}' if label != 0 else '0', ha='center', fontsize=11, color='black') # 降低y位置# 添加底部标题,使用更吸引人的颜色
ax.text(1010, -0.003, 'A Normal Distribution', ha='center', fontsize=13, color='#FF8C00') # DarkOrange
ax.text(1010 + shift, -0.003, 'The Standard Normal Distribution', ha='center', fontsize=13, color='#FF8C00')# 添加箭头和"Standardize"文本
ax.annotate('Standardize', xy=(1010 + shift / 2 + 20, 0.01), xytext=(1010 + shift / 2 - 30, 0.015),arrowprops=dict(facecolor='orange', edgecolor='orange', shrink=0.05, width=5, headwidth=15),fontsize=14, color='orange', ha='center')# 设置限值,确保右侧完整可见
ax.set_xlim(940, 1010 + shift + 70 + 20) # 扩展xlim到右侧边缘+缓冲
ax.set_ylim(0, 0.025)
ax.axis('off') # 移除轴以匹配原风格# 显示图表
plt.show()