关于有放回与无放回抽样均值一致问题的代码排查请求
无放回抽样均值完全相同的原因及解决办法
问题根源
你在无放回抽样时设置了size = len(q2array),这会让np.random.choice执行全量无放回抽样——本质就是把原数组的元素打乱顺序重新排列,但所有元素都被保留,没有任何增减。既然元素和原数组完全一致,只是顺序不同,计算出来的均值自然和原数组均值一模一样,每次抽样结果的均值也就不会有变化。
验证方法
你可以打印原数组的均值,会发现和三次无放回抽样的均值完全相等:
print('原数组均值:', np.mean(array))
修改方案
如果想观察无放回抽样的均值波动,需要将抽样的size设置为小于原数组的长度,比如抽取原数组一半的元素。修改后的代码示例:
import numpy as np def sample(q2array, replace=True, sample_size=None): # 未指定抽样大小时,默认用原数组长度 if sample_size is None: sample_size = len(q2array) sampling = np.random.choice(q2array, size=sample_size, replace=replace) return sampling # 有放回抽样(原逻辑不变) replace1=sample(array, True) print('有放回抽样均值1:', np.mean(replace1)) replace2=sample(array, True) print('有放回抽样均值2:', np.mean(replace2)) # 无放回抽样:抽取原数组一半长度的元素 noreplace1=sample(array, False, sample_size=len(array)//2) print('无放回抽样均值1:', np.mean(noreplace1)) noreplace2=sample(array, False, sample_size=len(array)//2) print('无放回抽样均值2:', np.mean(noreplace2))
这样修改后,无放回抽样每次抽取的元素是原数组的子集,均值就会出现正常的波动了。
内容的提问来源于stack exchange,提问作者zlaa
相关产品推荐
相关产品推荐

