使用PyMC3进行优化

时间:2019-06-25 21:19:47

标签: python python-3.x optimization pymc3

问题摘要

我一直在优化函数VectorizedVcdfe,但仍在尝试对其进行优化。此功能负责另一个功能customFunc的慢度的99%。 customFunc用于PyMC3代码块。

请帮助我优化VectorizedVcdfe

优化功能

def VectorizedVcdfe(self, x, dataVector, recip_h_times_lambda_vector):
    n = len(dataVector)

    differenceVector = x - dataVector

    stackedDiffVecAndRecipVec = pymc3.math.stack(differenceVector, recip_h_times_lambda_vector)

    erfcTerm  = 1. - pymc3.math.erf(self.neg_sqrt1_2 * pymc3.math.prod(stackedDiffVecAndRecipVec, axis=0))

    # Calc F_Hat
    F_Hat = (1. / float(n)) * pymc3.math.sum(0.5 * erfcTerm)

    # Return F_Hat
    return(F_Hat)

参数/变量

x是一个TensorVariable。

dataVector是一个1Xn的numpy矩阵。

recip_h_times_lambda_vector也是1Xn numpy矩阵。

neg_sqrt1_2是一个标量常数。

customFunc的使用方式

with pymc3.Model() as model:
    # Create likelihood
    like = pymc3.DensityDist('X', customFunc, shape=2)

    # Make samples
    step = pymc3.NUTS()
    trace = pymc3.sample(2000, tune=1000, init=None, step=step, cores=2)

编辑:

要回答评论者,对于dataVector和{ recip_h_times_lambda_vector用于进行此优化。实际上,recip_h_times_lambda_vector依赖于dataVector和标量参数h

一些评论者想知道customFunc,所以在这里……

def customFunc(X):
    Y = []
    for j in range(2):
        x_j = X[j]
        F_x_j = fittedKdEstimator.VCDFE(x_j)
        y_j = myPPF(F_x_j)
        Y.append(y_j)

    logLikelihood = 0.
    recipSqrtTwoPi = 1. / math.sqrt(2. * math.pi)

    for j in range(2):
        y_j = Y[j]
        logLikelihood += pymc3.math.log(recipSqrtTwoPi * pymc3.math.exp(y_j * y_j / -2.))

    return(pymc3.math.exp(logLikelihood))

全局变量fittedKdEstimator是包含函数VectorizedVcdfeVCDFE的类的实例。

这是VCDFE的Python代码...

def VCDFE(self, x):
    if not self.beenFit: raise Exception("Must first fit to data")

    return(self.VectorizedVcdfe(x, self.__dataVector, self.__recip_h_times_lambda_vector))

另外,函数myPPF是我对标准普通“百分点函数”(又称为“分位数函数”)的实现。我为customFunc计时了,myPPF花费了整个时间的一小部分。 VectorizedVcdfe消耗了绝大多数时间。

最后但并非最不重要的是,n的典型值可能在10,000到100,000之间。

0 个答案:

没有答案