我有一些问题,试图转换一个潜在的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个箱子的分发:
potentials = [mc.Potential(self.regname,self.wrapper(truth=truth[0:8],parameters=self.parameterslist[0]))]
这在Tikhonov函数中失败是因为
TypeError: object of type 'TensorVariable' has no len()
因此,在抽样过程中,似乎不可能评估变量的值。你知道吗
pymc2的实现工作得很好,所以如果有人对如何在pymc3中工作有一些想法,我会非常高兴的! 谢谢
目前没有回答
相关问题 更多 >
编程相关推荐