如何解决向 scipy.stats.rv_continuous 添加方法,rv_frozen 问题
我想为 scipy.stats.rv_continuous 中的所有分布添加一个方法。该方法将返回累积计数,即额外参数 nu(总计数)与现有 cdf 函数的乘积。我尝试将新方法添加到 rv_continuous
类,如下所示:
from scipy.stats import rv_continuous,uniform,gamma
def cntsCumul(self,x,nu): return nu * self.cdf(x)
rv_continuous.cntsCumul = cntsCumul
x = [-0.76,1.2,5.67]
for xx in x: print(uniform.cdf(xx)) # OK
for xx in x: print(uniform.cntsCumul(xx,3)) # Not OK
rv1 = uniform()
for xx in x: print(rv1.cdf(xx)) # OK
for xx in x: print(rv1.cntsCumul(xx,3)) # Not OK
a = 2
for xx in x: print(gamma.cdf(xx,a)) # OK
for xx in x: print(gamma.cntsCumul(xx,a,3)) # OK
rv2 = gamma(a)
for xx in x: print(rv2.cdf(xx)) # OK
for xx in x: print(rv2.cntsCumul(xx,3)) # Not OK
但得到以下错误:
---> 14 for xx in x: print(rv1.cntsCumul(xx,3)) # Not OK
15
16 a = 2
AttributeError: 'rv_frozen' object has no attribute 'cntsCumul'
不确定如何处理rv_frozen
。有什么建议么?另外,不确定参数是否会导致问题。
解决方法
您看到的直接问题是 rv2.cntsCumul(xx,3)
创建了一个所谓的冻结分布,它的形状和位置/比例是固定的——这样,例如norm(loc=0,scale=2).pdf(x)
等价于 norm.pdf(x,loc=0,scale=2)
等,源码中见 rv_continuous.__call__
等。
现在,冻结分布(rv_frozen
实例)创建底层 rv_continuous
子类的新实例(存储为 self.dist
实例的 rv_frozen
属性),并且那个人不知道你的猴子补丁。
另请注意,您正在执行的操作并未考虑形状参数:例如gamma
的形状为 a
,因此签名为 scipy.stats.gamma.pdf(x,a,loc,scale)
。 loc 和 scale 有默认值,但 shape 没有。
顺便说一句,就像我在评论中所说的那样,说得委婉一点,有点不标准。
而且肯定很容易出错。
如果您需要多个发行版,只需对它们的 _gen
类进行子类化,或者如果确实需要,对实例进行猴子补丁。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。