pymc2至pymc3的电位

2024-05-23 20:01:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些问题,试图转换一个潜在的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中工作有一些想法,我会非常高兴的! 谢谢


Tags: inselflenreturnbinvaluedefargs