我在尝试将电位从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中工作有一些想法,我会非常高兴! 谢谢