机器学习之方差和标准差计算

张开发
2026/4/16 1:15:56 15 分钟阅读

分享文章

机器学习之方差和标准差计算
标准差σ完整计算指南这个公式是Z-score标准化Standardization其中的σ就是总体标准差Population Standard Deviation下面给你完整的计算步骤、公式、Python实现和注意事项。一、标准差的核心定义标准差是衡量一组数据离散程度的指标数值越大数据波动越大数值越小数据越集中。在机器学习/数据标准化中我们通常用总体标准差用全部样本计算公式如下1. 总体标准差公式对应公式中的σσ1N∑i1N(xi−μ)2 \sigma \sqrt{\frac{1}{N}\sum_{i1}^{N}(x_i - \mu)^2}σN1​i1∑N​(xi​−μ)2​xix_ixi​第iii个原始数据μ\muμmean该特征的平均值μ1N∑i1Nxi\mu \frac{1}{N}\sum_{i1}^{N}x_iμN1​∑i1N​xi​NNN样本总数∑i1N(xi−μ)2\sum_{i1}^{N}(x_i - \mu)^2∑i1N​(xi​−μ)2离均差平方和每个数据与均值的差的平方之和2. 样本标准差注意区分如果是用样本估计总体比如抽样统计分母用N−1N-1N−1贝塞尔校正公式s1N−1∑i1N(xi−xˉ)2 s \sqrt{\frac{1}{N-1}\sum_{i1}^{N}(x_i - \bar{x})^2}sN−11​i1∑N​(xi​−xˉ)2​ 关键提醒数据标准化Z-score必须用总体标准差分母N不能用样本标准差分母N-1否则标准化结果会偏离预期。二、手动计算步骤一步步算举个例子计算数据[1, 2, 3, 4, 5]的标准差步骤1计算平均值mean/μμ1234553 \mu \frac{12345}{5} 3μ512345​3步骤2计算每个数据与均值的差离均差1−3−2,2−3−1,3−30,4−31,5−32 1-3-2,\quad 2-3-1,\quad 3-30,\quad 4-31,\quad 5-321−3−2,2−3−1,3−30,4−31,5−32步骤3计算离均差的平方(−2)24,(−1)21,020,121,224 (-2)^24,\quad (-1)^21,\quad 0^20,\quad 1^21,\quad 2^24(−2)24,(−1)21,020,121,224步骤4计算平方和方差的分子4101410 41014 104101410步骤5计算方差总体方差σ21052 \sigma^2 \frac{10}{5} 2σ2510​2步骤6开平方得到标准差σ2≈1.4142 \sigma \sqrt{2} \approx 1.4142σ2​≈1.4142三、Python代码实现工程化用法1. 手动实现对应公式importmathdefpopulation_std(data):# 1. 计算均值meansum(data)/len(data)# 2. 计算离均差平方和sum_sqsum((x-mean)**2forxindata)# 3. 计算总体方差开平方得标准差variancesum_sq/len(data)returnmath.sqrt(variance)# 测试data[1,2,3,4,5]print(population_std(data))# 输出: 1.41421356237309512. 用NumPy/Pandas工业界标准用法importnumpyasnpimportpandasaspd# NumPyddof0 表示总体标准差默认就是0datanp.array([1,2,3,4,5])sigmanp.std(data,ddof0)# 必须指定ddof0否则部分版本默认ddof0部分为1要显式声明print(sigma)# 1.4142135623730951# PandasSeries.std()默认ddof1样本标准差必须手动改ddof0spd.Series([1,2,3,4,5])sigmas.std(ddof0)print(sigma)# 1.4142135623730951# 直接做Z-score标准化对应题目公式X_standard(data-data.mean())/np.std(data,ddof0)print(X_standard)# 输出: [-1.41421356 -0.70710678 0. 0.70710678 1.41421356]3. 用sklearn机器学习标准化工具fromsklearn.preprocessingimportStandardScaler# 注意StandardScaler内部用的就是总体标准差分母NscalerStandardScaler()datanp.array([[1],[2],[3],[4],[5]])# 必须是2D数组scaler.fit(data)print(均值:,scaler.mean_[0])# 3.0print(标准差:,scaler.scale_[0])# 1.4142135623730951print(标准化后:,scaler.transform(data).flatten())# 输出: [-1.41421356 -0.70710678 0. 0.70710678 1.41421356]四、关键注意事项避坑指南1. 分母N vs N-1的区别类型公式分母适用场景标准化是否可用总体标准差NNN全部样本已知如训练集全量数据✅ 必须用样本标准差N−1N-1N−1抽样估计总体如统计推断❌ 绝对不能用2. 标准差为0的情况如果某特征所有值都相同比如[5,5,5,5]标准差σ0\sigma0σ0此时标准化公式会出现除以0的错误。解决方案直接删除该特征无区分度给分母加一个极小值如1e-8避免除零X (x - mean) / (σ 1e-8)。3. 标准化的核心作用消除量纲影响比如“身高cm”和“体重kg”数值范围不同标准化后可公平参与模型训练加速模型收敛梯度下降类模型如神经网络、逻辑回归对特征尺度敏感标准化后收敛更快满足模型假设如SVM、KNN、PCA等算法依赖距离计算必须做标准化。五、拓展标准差 vs 方差方差σ2\sigma^2σ2是标准差的平方单位是原数据单位的平方不直观标准差σ\sigmaσ开平方后单位与原数据一致更适合解释数据波动。六、快速验证用题目公式做标准化后数据的均值一定为0标准差一定为1可以用代码验证datanp.array([1,2,3,4,5])X_standard(data-data.mean())/np.std(data,ddof0)print(标准化后均值:,X_standard.mean())# 0.0print(标准化后标准差:,X_standard.std(ddof0))# 1.0

更多文章