0

当观察到的数据是离散的时,我在运行 PYMC3 模型时遇到了困难。奇怪的是,如果观察到的数据包含值零 (0.),则模型将运行。

我读过其他建议使用 start = pm.find_MAP(fmin=scipy.optimize.fmin_powell)但不能解决问题的帖子。

pymc3.__version__ = '3.0'
theano.__version__ = '0.7.0.dev-RELEASE'
numpy.__version__ = '1.8.0rc1'
Python 2.7.10

请参阅iPython 笔记本

代码和错误如下。

import pymc3 as pm

data = [6.0,12.0,12.0,46.0,5.0,11.0,11.0,39.0,4.0,10.0,25.0,11.0,8.0,5.0,10.0,2.0,30.0,21.0]

with pm.Model() as model:
    alpha = pm.Uniform('alpha', lower=0, upper=100)
    mu = pm.Uniform('mu', lower=0, upper=100)

    y_pred = pm.NegativeBinomial('y_pred', mu=mu, alpha=alpha)

    y_est = pm.NegativeBinomial('y_est', 
                                mu=mu, 
                                alpha=alpha, 
                                observed=data)

    start = pm.find_MAP()

    step = pm.Metropolis()
    trace = pm.sample(20000, step, start, progressbar=True)

我得到的错误是:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-b9f2264fccfc> in <module>()
     14                                 observed=data)
     15 
---> 16     start = pm.find_MAP()
     17 
     18     step = pm.Metropolis()

/Library/Python/2.7/site-packages/pymc3/tuning/starting.pyc in find_MAP(start, vars, fmin, return_raw, disp, model, *args, **kwargs)
     79     if 'fprime' in getargspec(fmin).args:
     80         r = fmin(logp_o, bij.map(
---> 81             start), fprime=grad_logp_o, disp=disp, *args, **kwargs)
     82     else:
     83         r = fmin(logp_o, bij.map(start), disp=disp, *args, **kwargs)

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/optimize.pyc in fmin_bfgs(f, x0, fprime, args, gtol, norm, epsilon, maxiter, full_output, disp, retall, callback)
    775             'return_all': retall}
    776 
--> 777     res = _minimize_bfgs(f, x0, args, fprime, callback=callback, **opts)
    778 
    779     if full_output:

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/optimize.pyc in _minimize_bfgs(fun, x0, args, jac, callback, gtol, norm, eps, maxiter, disp, return_all, **unknown_options)
    830     else:
    831         grad_calls, myfprime = wrap_function(fprime, args)
--> 832     gfk = myfprime(x0)
    833     k = 0
    834     N = len(x0)

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/optimize.pyc in function_wrapper(*wrapper_args)
    279     def function_wrapper(*wrapper_args):
    280         ncalls[0] += 1
--> 281         return function(*(wrapper_args + args))
    282 
    283     return ncalls, function_wrapper

/Library/Python/2.7/site-packages/pymc3/tuning/starting.pyc in grad_logp_o(point)
     74 
     75     def grad_logp_o(point):
---> 76         return nan_to_num(-dlogp(point))
     77 
     78     # Check to see if minimization function actually uses the gradient

/Library/Python/2.7/site-packages/pymc3/blocking.pyc in __call__(self, x)
    117 
    118     def __call__(self, x):
--> 119         return self.fa(self.fb(x))

/Library/Python/2.7/site-packages/pymc3/model.pyc in __call__(self, state)
    397 
    398     def __call__(self, state):
--> 399         return self.f(**state)
    400 
    401 class LoosePointFunc(object):

/Library/Python/2.7/site-packages/theano/compile/function_module.pyc in __call__(self, *args, **kwargs)
    862                     node=self.fn.nodes[self.fn.position_of_error],
    863                     thunk=thunk,
--> 864                     storage_map=getattr(self.fn, 'storage_map', None))
    865             else:
    866                 # old-style linkers raise their own exceptions

/Library/Python/2.7/site-packages/theano/gof/link.pyc in raise_with_op(node, thunk, exc_info, storage_map)
    312         # extra long error message in that case.
    313         pass
--> 314     reraise(exc_type, exc_value, exc_trace)
    315 
    316 

/Library/Python/2.7/site-packages/theano/compile/function_module.pyc in __call__(self, *args, **kwargs)
    850         t0_fn = time.time()
    851         try:
--> 852             outputs = self.fn()
    853         except Exception:
    854             if hasattr(self.fn, 'position_of_error'):

ValueError: Input dimension mis-match. (input[0].shape[0] = 1, input[4].shape[0] = 18)
Apply node that caused the error: Elemwise{Composite{Switch(i0, i1, Switch(i2, Switch(i3, i1, i4), i1))}}(TensorConstant{(1,) of 0}, TensorConstant{(1,) of 0}, Elemwise{mul,no_inplace}.0, InplaceDimShuffle{x}.0, TensorConstant{[  6.  12... 30.  21.]})
Toposort index: 33
Inputs types: [TensorType(int8, vector), TensorType(int8, (True,)), TensorType(int8, (True,)), TensorType(int8, (True,)), TensorType(float64, vector)]
Inputs shapes: [(1,), (1,), (1,), (1,), (18,)]
Inputs strides: [(1,), (1,), (1,), (1,), (8,)]
Inputs values: [array([0], dtype=int8), array([0], dtype=int8), array([1], dtype=int8), array([0], dtype=int8), 'not shown']
Outputs clients: [[Sum{acc_dtype=float64}(Elemwise{Composite{Switch(i0, i1, Switch(i2, Switch(i3, i1, i4), i1))}}.0)]]

HINT: Re-running with most Theano optimization disabled could give you a back-trace of when this node was created. This can be done with by setting the Theano flag 'optimizer=fast_compile'. If that does not work, Theano optimizations can be disabled with 'optimizer=None'.
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node.
4

0 回答 0