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

R语言中基于条件筛选向量值并绘制TRUE条件样本

Hey 你好!看起来你在尝试用接受拒绝法生成符合cos²(x)/π分布的样本,但代码里有几个小问题,导致没法正确筛选出可接受的样本并绘图。咱们一步步修正,然后实现你要的绘图效果:

第一步:修正代码逻辑,保存候选样本

首先,你需要先保存用来计算密度的x候选样本,这样才能和后续的接受状态一一对应。另外,接受拒绝法的判断逻辑也需要调整——应该用0到1之间的均匀随机数和归一化后的密度值比较,而不是用0到2π的数:

# 定义目标密度函数(你写的这个没问题,3.142813是π的近似值)
rcos2 <- function(x) { ((cos(x))^2)/3.142813 }

# 先生成x的候选样本(来自建议分布:0到2π的均匀分布)
x_candidates <- runif(1000, 0, 2*pi)

# 计算每个候选x对应的目标密度值
dens_values <- rcos2(x_candidates)

# 计算目标密度的最大值(理论上是1/π≈0.3183,和你的近似值匹配)
maxdens <- max(dens_values)

# 接受拒绝法的正确判断:用0-1的均匀随机数和归一化密度值比较
u <- runif(1000)  # 生成0到1之间的均匀数
accepted <- ifelse(u < (dens_values/maxdens), TRUE, FALSE)
第二步:提取被接受的样本并绘图

现在accepted是和x_candidates一一对应的逻辑向量,我们可以用逻辑索引提取出所有被接受的x值,然后根据需求绘制直方图或密度图:

方式1:绘制直方图(直观展示样本分布)

# 提取被接受的x样本
accepted_x <- x_candidates[accepted]

# 绘制直方图,同时叠加目标密度曲线做对比
hist(accepted_x, freq = FALSE, 
     main = "符合cos²(x)/π分布的接受样本",
     xlab = "x", col = "#cce5ff", border = "white")
# 添加目标密度曲线
curve(rcos2(x), from = 0, to = 2*pi, col = "#ff4d4d", lwd = 2, add = TRUE)

方式2:绘制密度估计曲线(看样本密度和目标密度的拟合度)

# 绘制样本的密度估计曲线
plot(density(accepted_x), 
     main = "接受样本的密度估计",
     xlab = "x", col = "#3399ff", lwd = 2)
# 叠加目标密度曲线
curve(rcos2(x), from = 0, to = 2*pi, col = "#ff4d4d", lwd = 2, add = TRUE)
# 添加图例
legend("topright", legend = c("样本密度估计", "目标密度"),
       col = c("#3399ff", "#ff4d4d"), lwd = 2)
说说你原代码里的问题

你原代码中的accepted判断逻辑有两个问题:

  1. 你用了runif(1000,0,2*pi)生成的06.28的数和`sample/maxdens`(01之间)比较,几乎所有结果都是FALSE,这完全不符合接受拒绝法的逻辑;
  2. 你没有保存生成sample时的x值,所以即使判断正确,也没法对应到哪些x是被接受的。

内容的提问来源于stack exchange,提问作者CringleVonChubbleslerry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:34:12