微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

向 scipy.stats.rv_continuous 添加方法,rv_frozen 问题

如何解决向 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 举报,一经查实,本站将立刻删除。