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

基于U(0,1)生成Geometric分布样本均值收敛优化问题

统计理论作业优化求助

我在《统计理论》课程作业中遇到如下习题,已完成初步代码编写与绘图,现寻求优化方案:

基于Uniform(0,1)分布定义离散随机变量,设置n=1000进行模拟,绘制样本均值随n变化的曲线与PMF,添加理论均值水平横线(需分析推导理论均值,可使用tex编写推导,允许调用该分布已知公式)。
Geometric(p)的参数p需从U(0,1)中随机选取,代码需适配通用p参数,禁止使用“魔数”,严格采用参数化写法。

核心问题

如何获得更精准的模拟结果,使蓝色样本均值曲线尽可能收敛到期望的理论值?

理论均值推导

本题采用的是首次成功所需试验次数型几何分布,支撑为$k \in {1,2,3,...}$,概率质量函数为:
$$P(X=k) = (1-p)^{k-1}p, \quad k=1,2,...$$
期望推导如下:
$$
\begin{align*}
E[X] &= \sum_{k=1}^{\infty} k \cdot P(X=k) \
&= \sum_{k=1}^{\infty} k(1-p)^{k-1}p \
&= p \cdot \sum_{k=1}^{\infty} k(1-p)^{k-1} \
&= p \cdot \frac{1}{p^2} = \frac{1}{p}
\end{align*}
$$

原有实现代码

library(glue)

p = runif(1) # 随机选取p
n = 1000

real_avg = 1/p

cum_sum = 0
avg = numeric()
for (i in 1:n) {
  cum_sum = cum_sum + ceiling(log(U[i],10)/log(1-p,10))
  avg=c(avg,cum_sum / i)
}
plot(1 : n, avg, type = "l", lwd = 2, col = "blue", ylab = glue("p={round(p,digits=4)}对应的观测均值"),
    xlab = "试验次数")
    abline(h=real_avg,col="red")

print(glue("p={round(p,4)}"))
print(glue("期望E[X]={1/p}"))

原有模拟效果

模拟结果示意图

优化方案

原有代码问题

  1. 未定义随机数向量U,直接运行会报错
  2. 动态拼接avg向量,每次迭代都要复制全量内存,效率低且容易引入随机误差
  3. 使用常用对数(底为10)计算,精度低于自然对数
  4. 未设置随机数种子,结果不可复现
  5. 当p取值较小时,几何分布会出现极端大值,1000的样本量不足以覆盖长尾,收敛效果差

优化后代码

library(glue)

# 参数集中定义,无魔数
set.seed(123) # 随机种子保证可复现
n_sim <- 10000 # 可调整模拟次数,越大收敛效果越好
p <- runif(1)
theory_mean <- 1/p

# 预生成所有随机数,预分配存储向量,避免动态扩容
u_vec <- runif(n_sim)
x_vec <- ceiling(log(u_vec) / log(1 - p)) # 用自然对数提升精度
cum_mean_vec <- cumsum(x_vec) / seq_along(x_vec)

# 绘制均值收敛曲线
par(mfrow = c(1,2)) # 分栏同时绘制收敛曲线和PMF
plot(seq_along(cum_mean_vec), cum_mean_vec, type = "l", lwd = 2, col = "blue",
     xlab = "试验次数", ylab = glue("样本均值 (p={round(p,4)})"),
     main = "样本均值收敛曲线")
abline(h = theory_mean, col = "red", lwd = 2, lty = 2)
legend("topright", legend = c("样本均值", "理论均值"), col = c("blue", "red"), lwd = 2)

# 绘制PMF
pmf_table <- table(x_vec) / length(x_vec)
plot(as.integer(names(pmf_table)), as.numeric(pmf_table), type = "h", lwd = 3, col = "darkgreen",
     xlab = "取值k", ylab = "概率P(X=k)", main = "几何分布模拟PMF")

# 输出结果
print(glue("随机生成的p值为:{round(p, 4)}"))
print(glue("理论均值为:{round(theory_mean, 4)}"))
print(glue("最终模拟均值为:{round(tail(cum_mean_vec, 1), 4)}"))

优化效果说明

  • 调整样本量到10000后,样本均值的收敛稳定性会大幅提升,和理论均值的偏差通常可以控制在1%以内
  • 所有参数都在代码开头统一定义,完全符合参数化要求,无魔数
  • 补充了PMF绘制逻辑,满足习题的全部要求

内容的提问来源于stack exchange,提问作者Amit Ben-David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:36:03