已知均匀分布[0,d]的n个样本如何估计d及实验代码问题求助
均匀分布[0,d]参数d的估计方法
对于来自[0,d]均匀分布的n个独立样本,常用的两类估计思路如下:
- 样本最大值估计:直接取样本最大值作为d的估计值,该估计为有偏估计,修正无偏版本为 $\frac{n+1}{n} \times 样本最大值$
- 2倍样本均值估计:均匀分布的期望为$\frac{d}{2}$,因此可以用$2 \times 样本均值$作为d的无偏估计
改写代码的错误原因
改写代码无法得到预期效果,核心是对原始代码中列表推导式的逻辑拆解错误,具体问题如下:
sample_random_normal函数内的循环在第一次迭代就执行了return,仅返回样本量为1时的一组估计值,不会生成1~99所有样本量对应的估计结果repeat_experiment函数同样是第一次循环就return,仅执行1次实验,不会完成100次重复实验取平均的逻辑,最终得到的结果只有1组值,无法匹配后续DataFrame里长度为99的k序列
等价于原始逻辑的非列表推导式改写代码
如果不适应列表推导式的写法,可以用下面的常规循环写法实现和原始代码完全一致的效果:
import numpy as np import pandas as pd import matplotlib.pyplot as plt def sample_random_normal(n = 100): res = [] # 遍历1~99的样本量 for i in range(1, 100): # 生成样本量为i的均匀分布样本 j = np.random.uniform(0, n, size=i).astype(int) # 存储当前样本量下的两个估计值 res.append(np.array([max(j), 2*np.mean(j)])) return np.array(res) def repeat_experiment(): experiments = [] # 重复100次实验 for _ in range(100): experiments.append(sample_random_normal()) experiments = np.array(experiments) # 对同一k值下的100次实验结果取平均 return experiments.mean(axis = 0) result = repeat_experiment() df = pd.DataFrame(result) df.columns = ['max_value', '2*mean'] df['k'] = range(1, 100) df['actual_value'] = 100 df['max_value-actual-value'] = df['max_value'] - df['actual_value'] df['2*mean-actual_value'] = df['2*mean'] - df['actual_value'] plt.plot(df['k'], df['max_value'], linestyle='solid', label='max_value_estimate') plt.plot(df['k'], df['2*mean'], linestyle='dashed', label ='2*mean estimate') plt.legend() plt.show()
结果说明
运行代码后可以看到:随样本量k增大,样本最大值的估计偏差会快速收敛到0,方差也远小于2倍均值估计,实际应用中优先选择修正后的最大值估计量。
内容的提问来源于stack exchange,提问作者Harry Barsegyan
相关产品推荐
相关产品推荐

