カスタム対数尤度からサンプリングするために、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 関数が呼び出されていることはわかっています。
他にもいくつか質問があります: - 上記のランダム関数の目的は何ですか? 最初は前作かと思ったけどそうじゃない。