0

カスタム対数尤度からサンプリングするために、pymc を使用して MH チェーンを使用したいと考えています。しかし、私はそれを機能させることができず、適切な例をオンラインで見つけることができません。

def getPymcVariable(data):

  def logp(value):
    ...
    return ljps # returns a float

  def random():
    return np.random.rand(numDims);

  dtype = type(random());
  initPt = [0.45, 0.24, 0.68];

  ret = pymc.Stochastic(logp = logp,
                        doc = 'SNLS RV',
                        name = 'SNLS',
                        parents = {},
                        random = random,
                        trace = True,
                        value = initPt,
                        dtype = dtype,
                        observed = False,
                        cache_depth = 2,
                        plot = True,
                        verbose = 0 );
  return ret


if __name__ == '__main__':

    data = np.loadtxt('../davisdata.txt');
    numExperiments = 30;
    numSamples = 10000;

    SNLS = getPymcVariable(data)
    model = pymc.Model([SNLS]);
    mcmcModel = pymc.MCMC(model);
    mcmcModel.use_step_method(pymc.Metropolis, SNLS, proposal_sd=1);
    mcmcModel.sample(numSamples, burn=0, thin=1);
    x = mcmcModel.trace('SNLS')[:]
    np.savetxt(fileName, x);

これは 3 次元変数であり、logp() で計算された一様事前確率と対数尤度を持ちます。アダプティブ プロポーザル ディストリビューションを使用して MH チェーンを実行したいと考えています。しかし、サンプラーを実行するたびに、均一な分布が返されます (実際には、上記のランダム関数からサンプルが返されるだけです - 0.5*np.random.rand(numDims) に変更すると、Unif( (0, 1)^3) 分布。)

しかし、logp 関数が呼び出されていることはわかっています。

他にもいくつか質問があります: - 上記のランダム関数の目的は何ですか? 最初は前作かと思ったけどそうじゃない。

4

1 に答える 1