实现 rv_continuous

问题描述

我正在尝试通过实现 - set_fact: containB: true if item.val=='B' | default(false) #or containB: true if any val in val_list is 'B' with_items - "{{ val_list }}" 来编写具有更易于使用的参数(真实范围、mu 和 sig)的 scipy.stats.truncnorm 版本。我提供了 scipy.stats.rv_continuous_argcheck_get_support_pdf代码,但收到错误

_rvs

我怀疑它与 _parse_args() missing 4 required positional arguments: 'a','b','mu',and 'sig' 或实现 shapes 有关,但不知道如何解决它(我见过 How do you use scipy.stats.rv_continuous?)。

我使用的是 scipy v 1.5.2 和 Python 3.8.5。

代码

_parse_args

追溯:

from scipy.stats import *
import scipy.stats

class truncgauss_gen(rv_continuous):
    ''' a and b are bounds of true support
    mu is mean
    sig is std dev
    '''
    def _argcheck(self,a,b,sig): return (a < b) and (sig > 0)
        
    def _get_support(self,b):   return a,b
        
    def _pdf(self,x,mu,sig):   return scipy.stats.truncnorm.pdf(x,(a - mu) / sig,(b - mu) / sig,ac=mu,scale=sig)

    def _rvs(self,sig,size):    return scipy.stats.truncnorm.rvs((a - mu) / sig,scale=sig,size=size)
    
        
truncgauss = truncgauss_gen(name='truncgauss',momtype=1)

if __name__ == '__main__':
    print(scipy.__version__)    
    
    tg = truncgauss()
    dat = tg.rvs(a=-5.1,b=10.07,mu=2.3,n=10)
    print(dat)

解决方法

不太确定问题是什么,但将所有变量传递给每个函数,如下所示似乎有效。

class truncG_gen(rv_continuous):
    def _argcheck(self,a,b,mu,sig): return (a < b) and (sig > 0)
        
    def _get_support(self,sig):  return a,b
        
    def _pdf(self,x,sig):   return scipy.stats.truncnorm.pdf(x,(a - mu) / sig,(b - mu) / sig,loc=mu,scale=sig)

    def _cdf(self,sig):   return scipy.stats.truncnorm.cdf(x,scale=sig)
    
    def _rvs(self,sig,size=None,random_state=None):
        return scipy.stats.truncnorm.rvs((a - mu) / sig,scale=sig,size=size,random_state=random_state)

truncG = truncG_gen(name='truncG',momtype=1)
'''