样本还是总体?
本课属于 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两者都会将相同的平方偏差相加,然后相除:
除以 n 适用于总体,因为其中包含所有值。样本围绕自己的均值,因此离散程度看起来较小;n - 1 可以对此进行补偿。
ddof=1 会让 NumPy 使用样本公式:np.std(a, ddof=1) 与 pandas 的结果一致。模型数据是样本:不同工具算出的标准差不一致,原因是 ddof,不是 bug。
挑战
简单一位生物学家计算几只蝙蝠翼展(单位:cm)的标准差时,得到了两个不同的结果。初始代码将它们读入数组 spans 和 Series column;检查结果输出 False。
- 这些蝙蝠是一个样本:修改 NumPy 那一行,让两种工具都计算出样本标准差。
- 在下面输出 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}")
# 在下方编写你的代码。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
机器学习统计学中的所有课
自己练习: Python 在线编译器