Hello所有PYTHON用户(特别是PyMC用户)。
问题:
我想使用MCMC执行函数最小化。我的函数L(碰巧是-logGaussian)有N个变量。我想循环一个变量并保持固定,在剩余的N-1个自由变量上采样L.这样做的目的是建立"简介" L在多维参数空间中沿着一个特定方向。因此,我不对N-1自由参数的后验分布感兴趣,而是对N-1参数的样本和函数L的相应值感兴趣。
我的实施(示意图 - 没有MWE):
import numpy as np
from pymc import Uniform, MCMC
# the quantity I will be looping on
J_array = np.linspace(15,18,10)
# the other N-1 parameters which need to be sampled
a = Uniform('a', lower=0, upper=10)
b = Uniform('b', lower=0, upper=10)
c = Uniform('c', lower=0, upper=10)
r = Uniform('r', lower=0, upper=10)
for J in J_array:
# (must all parents be distributed according to a distribution
# or is there a way to avoid this?)
# I define the looped-over variable as a uniformly-distributed
# observed quantity (right?)
J_i = Uniform('J', lower=15, upper=18, value=J, observed=True)
# the deterministic L the values of which I'm interested in
@deterministic
def L(J=J_i, a=a, b=b, c=c, r=r):
return LL(J, a, b, c, r)
M = MCMC(L)
我也试过
J = Uniform('r', lower=15, upper=18, value=J_array, observed=True)
@deterministic
def L(J=J, a=a, b=b, c=c, r=r):
return LL(J, a, b, c, r)
M = MCMC(L)
和
def model(J):
a = Uniform('a', lower=0, upper=10)
b = Uniform('b', lower=0, upper=10)
c = Uniform('c', lower=0, upper=10)
r = Uniform('r', lower=0, upper=10)
J_i = Uniform('r', lower=15, upper=18, value=J, observed=True)
@deterministic
def L(J=J_i, a=a, b=b, c=c, r=r):
return LL(J, a, b, c, r)
return L
for J in J_array:
M = MCMC(model(J))
在所有情况下,LL
是具有__call__
方法的类的实例,并且在所有情况下我都得到
TypeError: 'numpy.float64' object is not iterable
我对重复采样不感兴趣(因为我不关心后代)。
在M = MCMC(loglike)
之后我想通过绘制(比方说)1000个变量{{1}的值来为每个J
以马尔可夫方式L(J | a,b,c,r)进行采样}。由此,我将提取最小L值及其相应的参数。
正确的代码形式是:
a, b, c, r
表明并非def model(J):
a = Uniform('a', lower=0, upper=5)
b = Uniform('b', lower=0, upper=5)
c = Uniform('c', lower=0, upper=5)
r = Uniform('r', lower=0, upper=5)
@deterministic
def loglike(J=J, a=a, b=b, c=c, r=r):
return LL(a, b, J, r, c)
return locals()
for J in J_array:
M = MCMC(model(J))
变量的所有父项都必须是pymc-distributed变量。
我仍然不知道这是否是通过MCMC采样执行功能最小化的最智能方式。我想听听不同意或只是提出建议的读者的评论 非常感谢所有用户。