从pymc2到pymc3的潜力

时间:2019-05-06 15:50:28

标签: python theano pymc3 pymc

我在尝试将电位从pymc2转换为pymc3时遇到一些问题。

这是代码的主要部分,对可能性施加了额外的潜力:

truthpot = self.regularization.getpotential(truth)

在此处定义正则化:

import pymc3 as mc

from .tikhonov import tikhonov
potentialdict = {
    'Tikhonov':tikhonov,
    }

class Regularization(object):
    def __init__(self,regname='',parameters=[]):
        self.regname = regname
        self.parameterslist = parameters
        self.ndiffbins = len(parameters) if len(parameters)>0 else 1
        if self.regname in potentialdict: 
            self.function = potentialdict[self.regname]
        else:
            print('WARNING: potential name not found! Falling back to no potential...')

    def wrapper(self,truth=None,parameters={}):
        default_args = dict(value=truth)
        args = dict(default_args.items()+parameters.items())
        potential = self.function(**args)
        return potential

    def getpotential(self,truth):
        ntotbins = len(truth)
        step = ntotbins/self.ndiffbins
        edges = [(ii,ii+step) for ii in range(0,ntotbins,step)]
        potentials = [mc.Potential(self.wrapper,self.regname,self.regname,
                                {'truth':truth[start:end],'parameters':params})
                      for params,(start,end) in zip(self.parameterslist,edges)]
return mc.math.stack(potentials)

以及定义tikhonov公式的位置

from math import fabs

def tikhonov(value,refcurv=6.1e05,alpha=1e-8):
    def computeCurvature(bin): return value[bin-1]-2.0*value[bin]+value[bin+1]
    curvature = sum([c*c for c in map(computeCurvature,range(1,len(value)-1))])
    deltaCurv = fabs(curvature-refcurv)
    return -deltaCurv*alpha

我尝试了几种在Pymc3中定义电位的方法,但始终失败。 例如,如果我仅考虑具有8个bin的分布:

potentials = [mc.Potential(self.regname,self.wrapper(truth=truth[0:8],parameters=self.parameterslist[0]))]

由于theano的抱怨,这在Tikhonov函数中失败了

TypeError: object of type 'TensorVariable' has no len()

因此似乎无法在采样期间评估变量的值。

pymc2实现工作正常,因此,如果有人对如何使其在pymc3中工作有一些想法,我会非常高兴! 谢谢

0 个答案:

没有答案