1
我在GPU上玩MCMC,需要針對CUDA編寫的各種採樣器的實現。從CUDA的各種發行版中生成隨機數
我在StackOverflow上看到的大多數帖子都涉及到統一,二項和正常採樣。是否有任何庫允許R中的d-p-q-r函數的簡單性和多樣性(請參閱this頁)?
我希望能夠從伽瑪,正態,二項式以及用於貝葉斯問題(逆卡方,逆伽馬)的逆分佈中採樣,並且寧願不必使用逆概率變換來編寫我自己的和接受拒絕抽樣。
我在GPU上玩MCMC,需要針對CUDA編寫的各種採樣器的實現。從CUDA的各種發行版中生成隨機數
我在StackOverflow上看到的大多數帖子都涉及到統一,二項和正常採樣。是否有任何庫允許R中的d-p-q-r函數的簡單性和多樣性(請參閱this頁)?
我希望能夠從伽瑪,正態,二項式以及用於貝葉斯問題(逆卡方,逆伽馬)的逆分佈中採樣,並且寧願不必使用逆概率變換來編寫我自己的和接受拒絕抽樣。
對於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;
}
}
AFAIK,沒有這樣的庫。 [Thrust](http://thrust.github.io/doc/group__random.html)或[cuRAND](https://developer.nvidia.com/curand)支持通常的發行版,但您可能需要製作自己的發行版內核爲異國情調的。如果你找不到任何圖書館,這可能不太難實施,甚至可以集成到其他圖書館(特別是Thrust,它可以很容易地在Github上分發)。 – BenC