Menu
CoddyTech

样本还是总体?

本课属于 Coddy Machine Learning 学习旅程的“机器学习统计学”单元。第 4 课,共 64 课。

一位养蜂人称了 5 个蜂箱里的蜂蜜,单位是 kg。NumPy 和 pandas 对标准差(std)的计算结果不一致:

values = [18, 22, 25, 19, 26]
print(np.round(np.std(values), 2))
print(np.round(pd.Series(values).std(), 2))

这会打印:

3.16
3.54

两者都会将相同的平方偏差相加,然后相除:

5 个蜂箱的平方偏差分别为 16、0、9、9 和 16,相加后得到 50。一个箭头指向 np.std:50 / 5 = 10,标准差为 3.16,使用总体公式。另一个箭头指向 pandas:50 / 4 = 12.5,标准差为 3.54,使用样本公式

除以 n 适用于总体,因为其中包含所有值。样本围绕自己的均值,因此离散程度看起来较小;n - 1 可以对此进行补偿。

ddof=1 会让 NumPy 使用样本公式:np.std(a, ddof=1) 与 pandas 的结果一致。模型数据是样本:不同工具算出的标准差不一致,原因是 ddof,不是 bug。

challenge icon

挑战

简单

一位生物学家计算几只蝙蝠翼展(单位:cm)的标准差时,得到了两个不同的结果。初始代码将它们读入数组 spans 和 Series column;检查结果输出 False。

  1. 这些蝙蝠是一个样本:修改 NumPy 那一行,让两种工具都计算出样本标准差。
  2. 在下面输出 NumPy 默认的 np.std(spans) 比 column.std() 小多少,保留 2 位小数。

翼展分别为 33、27、30、35 和 29 时:

Sample std: 3.19 cm, tools agree: True
Dividing by n underestimated it by 0.34 cm

亲手试试

import numpy as np
import pandas as pd

n = int(input())
values = []
for i in range(n):
    values.append(int(input()))
spans = np.array(values)
column = pd.Series(values)

# 当前检查会输出 False:修改 NumPy 那一行,让两个工具都算出样本标准差。
numpy_std = np.round(np.std(spans), 2)
pandas_std = np.round(column.std(), 2)
print(f"Sample std: {numpy_std} cm, tools agree: {numpy_std == pandas_std}")

# 在下方编写你的代码。
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

机器学习统计学中的所有课

自己练习: Python 在线编译器