我一直在优化函数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
是包含函数VectorizedVcdfe
和VCDFE
的类的实例。
这是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之间。