高斯分布(正态分布)的性质与工程应用

高斯分布(Gaussian Distribution),又称正态分布(Normal Distribution),是统计学中最核心的概率分布。传感器噪声、测量误差、自然现象的波动等大量随机变量都近似服从正态分布。

直观理解

正态分布描述的是"大多数数据集中在某个值附近,偏离越远的数据越少"这种规律。图形上呈钟形曲线:

← 偏离中心越远,出现概率越低 μ(中心) 偏离中心越远,出现概率越低 →

现实例子:

概率密度函数(PDF)

正态分布的概率密度函数:

f(x)=1σ2πe(xμ)22σ2f(x) = \frac{1}{\sigma\sqrt{2\pi}} \, e^{-\frac{(x-\mu)^2}{2\sigma^2}}

其中:

μ 不同,σ 相同
μ₁
μ₂
曲线形状相同,位置不同
μ 相同,σ 不同
μ
— 小σ(瘦高)
— 大σ(矮胖)
σ 小→数据集中,σ 大→数据分散

68-95-99.7 法则

正态分布有一个重要性质:数据落在均值附近不同范围内的概率是固定的。

范围 概率 含义
μ±1σ\mu \pm 1\sigma 68.27% 约 2/3 的数据落在这个范围
μ±2σ\mu \pm 2\sigma 95.45% 约 19/20 的数据落在这个范围
μ±3σ\mu \pm 3\sigma 99.73% 只有 0.27% 的数据会落在外面

这就是 3σ3\sigma 准则的来源:如果一个数据点偏离均值超过 3σ3\sigma,它来自正态分布的概率只有 0.27%,可以合理怀疑它是异常值。

标准正态分布

μ=0\mu = 0σ=1\sigma = 1 时,称为标准正态分布。任意正态分布都可以通过 Z-score 标准化:

Z=xμσZ = \frac{x - \mu}{\sigma}

Z-score 表示"这个数据点偏离均值几个标准差"。例如:

工程应用

传感器数据建模

传感器读数通常可以建模为:

xmeasured=xtrue+ϵ,ϵN(0,σ2)x_{\text{measured}} = x_{\text{true}} + \epsilon, \quad \epsilon \sim \mathcal{N}(0, \sigma^2)

其中 ϵ\epsilon 是噪声,服从均值为 0、方差为 σ2\sigma^2 的正态分布。知道 σ\sigma 就能量化测量的可信度。

异常检测(3σ 准则)

基于 3σ3\sigma 准则的异常检测:

如果 xμ>3σ,则判定为异常\text{如果 } |x - \mu| > 3\sigma \text{,则判定为异常}
与 Hampel Filter 的关系
Hampel Filter 用 MAD(中值绝对偏差)替代标准差 σ\sigma,用中值替代均值 μ\mu。好处是:单个异常值不会像均值/标准差那样拉偏统计量,检测更鲁棒。3σ3\sigma 准则中的 σ\sigma 在 Hampel Filter 中对应 tσMADt \cdot \sigma \cdot \text{MAD}

工程中的典型场景

场景 μ\mu 的含义 σ\sigma 的含义
传感器校准 真实值或标称值 测量噪声幅度
质量控制 目标尺寸 加工误差范围
信号滤波 信号期望值 噪声强度

C 语言实现

计算概率密度(PDF)

#include <math.h>

/*
 * 正态分布概率密度函数
 * @param x:     输入值
 * @param mu:    均值 μ
 * @param sigma: 标准差 σ
 * @return:      概率密度 f(x)
 */
double gaussian_pdf(double x, double mu, double sigma)
{
    double z = (x - mu) / sigma;
    return exp(-0.5 * z * z) / (sigma * sqrt(2.0 * M_PI));
}

计算累积分布函数(CDF)

标准正态分布的 CDF 没有解析解,使用 Abramowitz & Stegun 近似(误差 < 7.5×10⁻⁸):

#include <math.h>

/*
 * 标准正态分布累积分布函数 Φ(z) 的近似
 * Abramowitz & Stegun 公式 26.2.17
 * @param z: 标准化后的值 Z = (x - μ) / σ
 * @return:  P(X ≤ z)
 */
double standard_normal_cdf(double z)
{
    if (z < 0) return 1.0 - standard_normal_cdf(-z);

    const double b0 = 0.2316419;
    const double b1 = 0.319381530;
    const double b2 = -0.356563782;
    const double b3 = 1.781477937;
    const double b4 = -1.821255978;
    const double b5 = 1.330274429;

    double t = 1.0 / (1.0 + b0 * z);
    double phi = exp(-0.5 * z * z) / sqrt(2.0 * M_PI);

    return 1.0 - phi * (b1*t + b2*t*t + b3*t*t*t + b4*t*t*t*t + b5*t*t*t*t*t);
}

/*
 * 一般正态分布的 CDF
 * @param x:     输入值
 * @param mu:    均值 μ
 * @param sigma: 标准差 σ
 * @return:      P(X ≤ x)
 */
double normal_cdf(double x, double mu, double sigma)
{
    return standard_normal_cdf((x - mu) / sigma);
}

异常检测示例

#include <stdio.h>
#include <math.h>

int main(void)
{
    /* 传感器读数 */
    double data[] = {100.2, 99.8, 100.5, 99.7, 150.0, 100.1, 99.9, 100.3, -80.0, 100.0};
    int n = sizeof(data) / sizeof(data[0]);

    /* 计算均值 */
    double mu = 0;
    for (int i = 0; i < n; i++) mu += data[i];
    mu /= n;

    /* 计算标准差 */
    double sigma = 0;
    for (int i = 0; i < n; i++) sigma += (data[i] - mu) * (data[i] - mu);
    sigma = sqrt(sigma / n);

    printf("均值 μ = %.2f\n", mu);
    printf("标准差 σ = %.2f\n", sigma);
    printf("\n%-12s %-8s %-10s %s\n", "数据", "Z-score", "P(|X-μ|<z)", "判定");
    printf("--------------------------------------------\n");

    for (int i = 0; i < n; i++) {
        double z = fabs(data[i] - mu) / sigma;
        double p = 2.0 * standard_normal_cdf(z) - 1.0;
        const char *result = (z > 3.0) ? "异常" : "正常";
        printf("%-12.2f %-8.2f %-10.4f %s\n", data[i], z, p, result);
    }
    return 0;
}

输出:

均值 μ = 87.05
标准差 σ = 57.64

数据         Z-score  P(|X-μ|<z)  判定
--------------------------------------------
100.20       0.23     0.1805      正常
99.80        0.22     0.1751      正常
100.50       0.23     0.1845      正常
99.70        0.22     0.1737      正常
150.00       1.09     0.7252      正常
100.10       0.23     0.1791      正常
99.90        0.22     0.1764      正常
100.30       0.23     0.1818      正常
-80.00       2.90     0.9962      正常
100.00       0.22     0.1778      正常

注意:此例中数据量太小(n=10),均值和标准差被异常值(150 和 -80)严重拉偏,导致 3σ3\sigma 准则失效——即使 -80 偏离均值 2.9σ,仍未触发 3σ 阈值。这正是 Hampel Filter 使用中值和 MAD 的原因——对异常值更鲁棒。实际应用中需要足够的样本量(通常 n > 30)才能获得可靠的 μ\muσ\sigma 估计。

局限性

总结

概念 公式/值 用途
均值 μ\mu 1nxi\frac{1}{n}\sum x_i 数据的中心位置
标准差 σ\sigma 1n(xiμ)2\sqrt{\frac{1}{n}\sum(x_i-\mu)^2} 数据的分散程度
Z-score xμσ\frac{x-\mu}{\sigma} 标准化,衡量偏离程度
3σ3\sigma 准则 Z>3\|Z\| > 3 → 异常 异常检测的简单判据

本文由 AI 辅助生成,可能存在错误或遗漏,请以实际资料和官方文档为准。