问题描述
我正在尝试通过实现 - 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)
'''