我正在玩在 GPU 上做 MCMC,并且需要为 CUDA 编写的各种采样器的实现。
我在 StackOverflow 上看到的大多数帖子都与统一、二项式和正态采样有关。是否有任何库可以让我在 R 中使用 dpqr 函数的简单性和多样性(请参阅此页面)?
我希望能够从 Gamma、Normal、Binomial 和贝叶斯问题中使用的逆分布(逆卡方、逆 gamma)中进行采样,并且不想使用逆概率变换和接受拒绝来编写我自己的采样。
我正在玩在 GPU 上做 MCMC,并且需要为 CUDA 编写的各种采样器的实现。
我在 StackOverflow 上看到的大多数帖子都与统一、二项式和正态采样有关。是否有任何库可以让我在 R 中使用 dpqr 函数的简单性和多样性(请参阅此页面)?
我希望能够从 Gamma、Normal、Binomial 和贝叶斯问题中使用的逆分布(逆卡方、逆 gamma)中进行采样,并且不想使用逆概率变换和接受拒绝来编写我自己的采样。
对于 Gamma 分布,这是我目前使用的。它是修改后的 GSL 函数以与 CuRAND 一起使用。
__device__ double ran_gamma (curandState localState, const double a, const double b){
/* assume a > 0 */
if (a < 1){
double u = curand_uniform_double(&localState);
return ran_gamma (localState, 1.0 + a, b) * pow (u, 1.0 / a);
}
{
double x, v, u;
double d = a - 1.0 / 3.0;
double c = (1.0 / 3.0) / sqrt (d);
while (1){
do{
x = curand_normal_double(&localState);
v = 1.0 + c * x;
} while (v <= 0);
v = v * v * v;
u = curand_uniform_double(&localState);
if (u < 1 - 0.0331 * x * x * x * x)
break;
if (log (u) < 0.5 * x * x + d * (1 - v + log (v)))
break;
}
return b * d * v;
}
}