You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已知均匀分布[0,d]的n个样本如何估计d及实验代码问题求助

均匀分布[0,d]参数d的估计方法

对于来自[0,d]均匀分布的n个独立样本,常用的两类估计思路如下:

  • 样本最大值估计:直接取样本最大值作为d的估计值,该估计为有偏估计,修正无偏版本为 $\frac{n+1}{n} \times 样本最大值$
  • 2倍样本均值估计:均匀分布的期望为$\frac{d}{2}$,因此可以用$2 \times 样本均值$作为d的无偏估计
改写代码的错误原因

改写代码无法得到预期效果,核心是对原始代码中列表推导式的逻辑拆解错误,具体问题如下:

  1. sample_random_normal函数内的循环在第一次迭代就执行了return,仅返回样本量为1时的一组估计值,不会生成1~99所有样本量对应的估计结果
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:27:04