我定义了一个自定义连续分布,并实现了
_pdf
和 _cdf
方法。
对于这些,我需要计算昂贵的常数(给定参数),即 PDF 的归一化常数和 CDF 的积分常数。每次评估(冻结)随机变量的任何函数时都会计算这些常数,这需要大量时间。
我想知道是否有一种方法可以为 SciPy 中的冻结随机变量预先计算或缓存/记忆这些昂贵的常量?
这里是一个示例分布的一些最小代码,其参数
a
和 b
由非标准化 PDF f(x, a, b)
及其反导数 F(x, a, b)
定义。昂贵的函数是范数 N(a,b)
和积分常数 C(a,b)
:
from scipy.stats import rv_continuous
class Example_gen(rv_continuous):
def _norm(self, a, b):
"""Expensive function"""
return N(a, b)
def _C(self, a, b):
"""Expensive function"""
return C(a, b)
def _pdf(self, x, a, b):
return f(x, a, b) / self._norm(a, b)
def _cdf(self, x, a, b):
return (F(x, a, b) + self._C(a, b)) / self._norm(a, b)
Example = Example_gen()
没有。当然,如果您考虑的特定分布定义了一些内部函数,您就可以对它们进行猴子修补以返回预先计算的值。但这肯定不受框架支持,如果你这样做,你就得靠自己了。