在学习概率论与数理统计时,几乎每一个人都曾产生过强烈的困惑:
计算**总体方差(Population Variance)**时,分母是总数 N;
但当我们从总体中抽取 n 个样本去估计整体离散度时,**样本方差(Sample Variance)**的分母却莫名其妙地变成了 n−1。
很多教材往往只用一句轻描淡写的“因为损失了一个自由度”带过,但这并没有解答工程师心中的疑问:为什么偏偏是减 1?如果不管它继续除以 n,究竟会发生什么?
而在计算机工程与数据科学的落地代码中,还有一个更为致命的隐藏陷阱:教科书上为了手算方便而推导的“平方和展开公式”,如果直接写进程序里,会在特定数据分布下发生灾难性的浮点精度雪崩,甚至算出一个极其荒谬的负数方差!
本站的描述统计计算器同时提供了总体方差 σ2 与无偏样本方差 s2 的精确计算。这篇文章详细拆解背后的数学推导与工业级算法实现。
1. 核心直觉:样本均值比真实均值“更贴近数据”
方差衡量的是一组数据相对于其均值的离散程度(平方距离的平均值)。
设总体的真实均值为 μ,真实方差为 σ2。
如果我们幸运地知道真实的总体均值 μ,那么样本对真实均值的离散度计算为:
n1i=1∑n(Xi−μ)2
这个估计量的期望值恰好就等于 σ2,无需任何修正。
但在实际抽样调查中,真实的总体均值 μ 是未知的!我们手中唯一的参考锚点,是用这组样本自己算出来的样本均值 Xˉ:
Xˉ=n1i=1∑nXi
关键数学事实:二次函数的极值点
根据微积分极值定理,对于任意一组固定的数值 X1,X2,…,Xn,使得二次距离和 ∑(Xi−c)2 取得最小值的实数 c,恰恰就是样本本身的平均数 Xˉ!
这意味着:对于任何不是 Xˉ 的常数(包括真实的总体均值 μ),必定有:
i=1∑n(Xi−Xˉ)2≤i=1∑n(Xi−μ)2
由于样本均值 Xˉ 是完全根据手头这几个样本计算出来的,它天然会向这几个样本点“靠拢”,导致每个样本点到 Xˉ 的距离,系统性地小于它们到真实总体均值 μ 的距离。
如果你依然用 n 作为分母,算出来的离散度必定会系统性低估总体的真实离散程度(偏小)。
2. 贝塞尔修正(Bessel’s Correction)的严格代数推导
我们来严格证明:直接除以 n 的有偏样本方差 Sn2,其期望值到底比真实方差 σ2 小了多少?
设 X1,…,Xn 为独立同分布(i.i.d.)的样本,期望 E[Xi]=μ,方差 Var(Xi)=σ2。
样本均值 Xˉ 的方差为:
Var(Xˉ)=E[(Xˉ−μ)2]=nσ2
展开平方项:
(Xi−Xˉ)2=((Xi−μ)−(Xˉ−μ))2=(Xi−μ)2−2(Xi−μ)(Xˉ−μ)+(Xˉ−μ)2
对全部 n 个样本求和:
i=1∑n(Xi−Xˉ)2=i=1∑n(Xi−μ)2−2(Xˉ−μ)i=1∑n(Xi−μ)+n(Xˉ−μ)2
由于 ∑i=1n(Xi−μ)=n(Xˉ−μ),中间项可以化简合并:
i=1∑n(Xi−Xˉ)2=i=1∑n(Xi−μ)2−n(Xˉ−μ)2
两边取数学期望:
E[i=1∑n(Xi−Xˉ)2]=i=1∑nE[(Xi−μ)2]−nE[(Xˉ−μ)2]=nσ2−n⋅(nσ2)=nσ2−σ2=(n−1)σ2
结论极其清爽漂亮:
样本偏差平方和的期望值,恰好只有总体方差的 (n−1) 倍,而不是 n 倍!
因此,若要构造一个无偏估计量(Unbiased Estimator),使得其期望严格等于 σ2,分母必须除以 n−1:
s2=n−11i=1∑n(Xi−Xˉ)2⟹E[s2]=σ2
这就是统计学中著名的贝塞尔修正。
3. 工程大坑:灾难性消除(Catastrophic Cancellation)
在教科书中,为了简化笔算,通常会给出方差的展开变形公式:
s2=n−11i=1∑nXi2−n1(i=1∑nXi)2
这个公式看起来非常诱人:只需要维护两个累加器(元素和、平方和),一趟遍历就能算完。
但在计算机浮点数体系下,这是极其危险的反模式代码!
浮点数灾难实测
假设我们输入三个极其接近的大数:
[1000000001, 1000000002, 1000000003]
理论上,它们的方差极其简单:均值为 1000000002,离差分别为 −1,0,1,方差严格等于 1。
但如果按展开公式用计算机的 64 位浮点数来算:
- ∑Xi2≈3×1018,这个数字已经逼近 253 的有效数字上限,低位有效位被粗暴截断;
- (∑Xi)2/3≈3×1018,同样被截断;
- 将两个被严重截断、几乎相等的巨大浮点数进行相减!
两个接近的极大浮点数相减,高位的有效数字全部抵消归零,剩下的完全是随机的浮点截断噪声。在实际运行中,计算结果可能会变成 0、1024,甚至算出一个极其荒谬的负数方差(开方求标准差时直接抛出 NaN 崩溃!)。
在数值分析中,这种现象被称为灾难性消除(Catastrophic Cancellation)。
4. 工业级解法:单趟在线 Welford 算法
1962 年,统计学者 B. P. Welford 提出了一种数值稳定性极高、且仅需单趟流式遍历的在线均值与方差更新算法。
它维护三个状态量:已读样本数 k、当前均值 Mk、离差平方和 Sk。
当新数据流 x 到达时,通过差值递推更新:
kδMkδ2Sk←k+1=x−Mk−1←Mk−1+kδ=x−Mk←Sk+δ×δ2
遍历结束后:
- 样本方差为:s2=n−1Sn;
- 总体方差为:σ2=nSn。
Welford 算法的核心优势
- 彻底消除大数截断误差:算法每一步运算的是新数据与当前均值的微小差值 δ=x−M,参与计算的数字规模极小,绝不会发生两个上百亿浮点数的高位碰撞消除;
- 零内存流式计算(One-pass streaming):不需要在内存中缓存全部历史数据数组,特别适合大数据流水线或实时统计监控。