Потенциал от pymc2 до pymc3 - PullRequest
0 голосов
/ 06 мая 2019

У меня есть некоторые проблемы при попытке преобразовать Потенциал из 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)

издесь, где определяется формула Тихонова

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]))]

, то это не работает в функции Тихонова из-за theano, который жалуется

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

, поэтому кажется, что невозможно оценитьзначения переменных во время выборки.

Реализация pymc2 работала просто отлично, поэтому, если у кого-то есть идеи о том, как заставить его работать в pymc3, я был бы более чем счастлив!Спасибо

...