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

如何修改R代码复现Dirichlet Process断棍过程的Python绘图效果?

Dirichlet Process断棍过程R代码修正:匹配Python绘图效果

你在把Austin Rochford的DP断棍过程Python代码转成R时,遇到了样本CDF分布没有围绕基分布H(正态分布)的问题,和原Python绘图差异明显。我检查了你的R代码,发现了几个核心逻辑错误,下面帮你修正:

核心问题分析

  • 断棍概率计算错误:原Python代码是按每行(每个样本)独立计算累积乘积,但你的R代码里cumprod(1 - betas)是对整个矩阵做累积,不是按行操作,这直接导致pis(断棍权重)完全不符合DP的断棍过程逻辑。
  • 三重循环效率低下:构造Dirac delta的部分用了三层for循环,不仅慢,还容易出错,完全可以用R的向量化操作替代。
  • 颜色设置偏离原效果:原Python用统一灰色加透明度展示样本CDF,你的代码用了piratepal("pony")的多彩色,视觉上和原效果差异大。

修正后的完整R代码

set.seed(433) # 和Python代码用相同的随机种子,保证结果可复现
N <- 20
K <- 30
ngrid <- 200
alpha <- 50

# 生成x轴网格
xgrid <- seq(-3, 3, length.out = ngrid)

# 生成beta矩阵:每行对应一个样本的K个beta值
betas <- matrix(rbeta(N * K, 1, alpha), nrow = N, ncol = K)

# 按行计算断棍权重pi,和Python逻辑完全一致
pis <- matrix(NA, nrow = N, ncol = K)
pis[, 1] <- betas[, 1]
for (j in 2:K) {
  pis[, j] <- betas[, j] * apply(1 - betas[, 1:(j-1)], 1, prod)
}

# 生成基分布H的样本:每行对应一个样本的K个omega值
omega <- matrix(rnorm(N * K), nrow = N, ncol = K)

# 向量化构造Dirac delta数组:替代三重循环,高效且清晰
# 逻辑:对每个omega[i,j],判断是否小于xgrid的每个点
dirac <- outer(c(omega), xgrid, FUN = function(o, x) as.integer(o < x))
dim(dirac) <- c(N, K, ngrid)

# 计算每个样本的CDF:按行和每个xgrid点求和
sample_cdfs <- apply(pis[, , drop = FALSE] * dirac, c(1, 3), sum)

# 绘图:贴近原Python的视觉效果
par(mfrow = c(1,1), mar = c(4,4,2,1))
# 绘制第一个样本CDF
plot(xgrid, sample_cdfs[1, ], col = "gray", lwd = 1, 
     type = "l", ylim = c(0, 1), xlab = "x", ylab = "CDF", 
     main = bquote(alpha == .(alpha)))
# 绘制剩余样本CDF
for (i in 2:N) {
  lines(xgrid, sample_cdfs[i, ], col = "gray", alpha = 0.75)
}
# 绘制基分布CDF
lines(xgrid, pnorm(xgrid), col = "black", lwd = 2)
# 添加图例
legend("topleft", legend = c("DP sample CDFs", "Base CDF"), 
       col = c("gray", "black"), lwd = c(1, 2))

关键修正说明

  1. 统一随机种子:加入set.seed(433),和原Python代码的随机种子一致,确保生成的随机数完全对应,方便对比结果。
  2. 按行计算断棍权重:用循环逐列计算每行的pis,完全复刻Python里pi[:, 1:] = beta[:, 1:] * (1-beta[:, :-1]).cumprod(axis=1)的逻辑,这是修正的核心。
  3. 向量化Dirac构造:用outer函数替代三重循环,把每个omega值和xgrid的所有点做比较,再调整维度,效率提升很多。
  4. 视觉效果对齐:用统一的灰色加透明度绘制样本CDF,黑色加粗绘制基分布CDF,添加和原Python一致的图例和标题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:02:42