高斯分布(正态分布)的性质与工程应用
高斯分布(Gaussian Distribution),又称正态分布(Normal Distribution),是统计学中最核心的概率分布。传感器噪声、测量误差、自然现象的波动等大量随机变量都近似服从正态分布。
直观理解
正态分布描述的是"大多数数据集中在某个值附近,偏离越远的数据越少"这种规律。图形上呈钟形曲线:
← 偏离中心越远,出现概率越低
μ(中心)
偏离中心越远,出现概率越低 →
现实例子:
- 同一批传感器在同一温度下的读数,会围绕某个值上下波动
- 人的身高围绕平均身高分布,极高和极矮的人很少
- 测量误差通常服从均值为 0 的正态分布
概率密度函数(PDF)
正态分布的概率密度函数:
其中:
- (mu):均值,决定分布的中心位置
- (sigma):标准差,决定分布的"胖瘦"—— 越大,曲线越扁平,数据越分散
- ,
μ 不同,σ 相同
曲线形状相同,位置不同
μ 相同,σ 不同
σ 小→数据集中,σ 大→数据分散
68-95-99.7 法则
正态分布有一个重要性质:数据落在均值附近不同范围内的概率是固定的。
| 范围 | 概率 | 含义 |
| 68.27% | 约 2/3 的数据落在这个范围 | |
| 95.45% | 约 19/20 的数据落在这个范围 | |
| 99.73% | 只有 0.27% 的数据会落在外面 |
这就是 准则的来源:如果一个数据点偏离均值超过 ,它来自正态分布的概率只有 0.27%,可以合理怀疑它是异常值。
标准正态分布
当 、 时,称为标准正态分布。任意正态分布都可以通过 Z-score 标准化:
Z-score 表示"这个数据点偏离均值几个标准差"。例如:
- :正好在均值上
- :比均值高 1 个标准差
- :比均值低 2 个标准差
工程应用
传感器数据建模
传感器读数通常可以建模为:
其中 是噪声,服从均值为 0、方差为 的正态分布。知道 就能量化测量的可信度。
异常检测(3σ 准则)
基于 准则的异常检测:
与 Hampel Filter 的关系
Hampel Filter 用 MAD(中值绝对偏差)替代标准差 ,用中值替代均值 。好处是:单个异常值不会像均值/标准差那样拉偏统计量,检测更鲁棒。 准则中的 在 Hampel Filter 中对应 。
工程中的典型场景
| 场景 | 的含义 | 的含义 |
|---|---|---|
| 传感器校准 | 真实值或标称值 | 测量噪声幅度 |
| 质量控制 | 目标尺寸 | 加工误差范围 |
| 信号滤波 | 信号期望值 | 噪声强度 |
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)严重拉偏,导致 准则失效——即使 -80 偏离均值 2.9σ,仍未触发 3σ 阈值。这正是 Hampel Filter 使用中值和 MAD 的原因——对异常值更鲁棒。实际应用中需要足够的样本量(通常 n > 30)才能获得可靠的 和 估计。
局限性
- 正态假设不一定成立:有些数据是偏态分布、多峰分布或重尾分布
- 对异常值敏感:均值和标准差容易被极端值拉偏(Hampel Filter 用中值和 MAD 解决了这个问题)
- 需要足够样本:小样本下 和 的估计不可靠
总结
| 概念 | 公式/值 | 用途 |
|---|---|---|
| 均值 | 数据的中心位置 | |
| 标准差 | 数据的分散程度 | |
| Z-score | 标准化,衡量偏离程度 | |
| 准则 | → 异常 | 异常检测的简单判据 |
本文由 AI 辅助生成,可能存在错误或遗漏,请以实际资料和官方文档为准。