1

私は GPU で MCMC をいじっていますが、CUDA 用に書かれたさまざまなサンプラーの実装が必要です。

私が StackOverflow で見た投稿のほとんどは、一様、二項、および通常のサンプリングに関連しています。R の dpqr 関数の単純さと多様性を可能にするライブラリはありますか (このページを参照)。

ガンマ分布、正規分布、二項分布、およびベイジアン問題で使用される逆分布 (逆カイ二乗、逆ガンマ) からサンプリングできるようにしたいと考えています。サンプリング。

4

1 に答える 1

4

ガンマ分布については、これが現在使用しているものです。これは、CuRAND で動作するように変更された GSL 関数です。

__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;
}
}
于 2014-05-19T05:23:25.157 に答える