如何在SciPy中预先计算冻结随机变量的常数?

lpwwtiir  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(83)

我已经定义了一个自定义的连续分布,并实现了_pdf_cdf方法。为此,我需要计算昂贵的常数(给定参数),即PDF的归一化常数和CDF的积分常数。每次计算(冻结)随机变量的任何函数时,都会计算这些常数,这需要花费大量时间。
我想知道是否有一种方法可以在SciPy中预先计算或缓存/记忆这些昂贵的常量,用于冻结随机变量?
下面是一个示例分布的一些最小代码,其中参数ab由非归一化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()

字符串

voase2hg

voase2hg1#

当然,如果你考虑的特定发行版定义了一些内部函数,你可以对它们进行猴子修补以返回预先计算的值。但这肯定不受框架支持,如果你这样做,你只能靠自己。

jfewjypa

jfewjypa2#

在本地缓存它们怎么样?你可以有一个字典,键是值的元组。
沿着(未经测试)

class Example_gen(rv_continuous):

    _n_cache = dict()
    _C_cache = dict()

    def _norm(self, a, b):
        """Expensive function"""
        key = (round(a,5), round(b,5))
        v = _n_cache.get(key) 
        if v is None:
            v = N(a, b)
            _n_cache[key] = v              
        
        return v

    def _C(self, a, b):
        """Expensive function"""
        key = (round(a,5), round(b,5))
        v = _C_cache.get(key) 
        if v is None:
            v = C(a, b)
            _C_cache[key] = v              
        
        return v

字符串
您可以通过阅读一些JSON文件或pickle来初始化缓存字典。

相关问题