我想使用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);它是一个三维变量,具有统一的先验和在logp()中计算的对数似然。我想运行一个具有自适应建议分发的MH链。但每次我运行采样器时,它只返回一个均匀分布(实际上,它只返回上述随机函数的样本-当我将其修改为0.5*np.random.rand(numDims)时,它返回一个Unif( (0,1)^3)分布。)
但是,我知道logp函数正在被调用。
我还有几个问题:-上面的随机函数的目的是什么?我最初以为这是个先知,但看起来不像。
发布于 2014-06-03 21:26:47
在PyMC2中,我发现使用内置发行版和@potential装饰器来完成这类任务要简单得多。下面是一个最小的例子:
X = pm.Uniform('X', 0, 1, value=[0.45, 0.24, 0.68])
@pm.potential
def SNLS(X=X):
logp = -X[0]**2 / X[1]
logp += -X[1]**2 / X[2] # or whatever...
return logp您可以选择自适应大都市步长方法,如下所示:
m = pm.MCMC([X, SNLS])
m.use_step_method(pm.AdaptiveMetropolis, X)这是a notebook that puts this together and plots the results。
https://stackoverflow.com/questions/23998590
复制相似问题