(python)函数最小化与PyMC持有一个参数固定

时间:2017-01-18 12:38:27

标签: python pymc minimization

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采样执行功能最小化的最智能方式。我想听听不同意或只是提出建议的读者的评论 非常感谢所有用户。

0 个答案:

没有答案