(十五)随机排列与分批累计
1. 特征与目标使用同一份排列
训练或抽样时,经常要打乱记录顺序。default_rng(7) 建立自己的随机数发生器,permutation 交回位置排列;用同一排列选择 x 和 y,原先同一行的数据才不会分开。
# 项目文件:demos/random_batches.py
# 一份排列同时选择特征与目标;分批统计按总和与总数合并,不平均各批均值。
import numpy as np
rng = np.random.default_rng(7)
x = np.arange(10).reshape(5, 2)
y = np.array([100, 200, 300, 400, 500])
order = rng.permutation(x.shape[0])
print("排列", order.tolist())
for start in range(0, len(order), 2):
selected = order[start : start + 2]
print("批次", x[selected].tolist(), y[selected].tolist())
values = np.array([10, 20, 30, 40, 100], dtype=np.float64)
total, count, means = 0.0, 0, []
for start in range(0, values.size, 2):
batch = values[start : start + 2]
total += float(batch.sum())
count += batch.size
means.append(float(batch.mean()))
print("批均值再平均", np.mean(means), "按总数", total / count)每批选择最多两项,最后一批只有一项。固定种子可以在同一项目环境里复现这段随机过程;随机数发生器仍会随着调用推进,所以不要在每一批开始时重新建立同种子的发生器,否则反复拿到的是同一段开头。
2. 不同大小的批次按总数合并
五个数 [10,20,30,40,100] 分成两项、两项、一项,批均值分别为 15、35、100。直接平均它们得到 50,让最后一条记录获得了与前两条合在一起相同的权重。
逐批累加总和与数量,最后计算 200/5=40,才与整组均值一致。分批改变保存与处理数据的方式,统计量的定义仍要保持相同。