在创建自定义连续分布时,使用scipy的rv_continuous方法

时间:2014-04-04 05:33:06

标签: python numpy scipy

我正在尝试计算E[f(x)]某些我根据数据生成/估算的pdf。

它在文档中说:

  

子类

     

可以通过子类化rv_continuous类来定义新的随机变量   并重新定义至少_pdf或_cdf方法(规范化为   位置0和比例1)将给出干净的参数(in   介于a和b之间并传递参数检查方法。

     

如果您的房车的正面参数检查不正确,那么您将   还需要重新定义_argcheck方法。

所以我分组并定义了_pdf,但每当我尝试调用时:

print my_continuous_rv.expect(lambda x: x)

scipy对我大喊:

AttributeError: 'your_continuous_rv' object has no attribute 'a'

这是有道理的,因为我猜它试图找出积分的下限,因为它也会在错误中打印出来:

lb = loc + self.a * scale

我尝试将属性self.a和self.b定义为(我认为是rv定义的限制/间隔):

self.a = float("-inf")
self.b = float("inf")

然而,当我这样做时,它抱怨并说:

if N > self.numargs:
AttributeError: 'your_continuous_rv' object has no attribute 'numargs'

我不确定numargs是什么假设但是在检查了github上的scipy代码之后它看起来就是这行代码:

if not hasattr(self, 'numargs'):
    # allows more general subclassing with *args
    self.numargs = len(shapes)

我假设是我的函数假设要采用的随机变量的形状。

目前我只做一个非常简单的随机变量,其中一个浮点值作为它的可能值。因此,我决定将numargs硬编码为1.但是,这只会导致更多地从scipy的部分大喊大叫。

因此,它归结为我从文档中认为我不清楚当我将其子类化时我必须做什么,因为我做了他们所说的,覆盖_pdf但是在这样做之后它要求我自己.a,我硬编码,然后它问我numargs,在这一点上,我想我得出结论我不知道他们是怎么想让我继承,rv_continuous。有人知道吗?我可以从我想要的数据中生成我想要的pdf,然后只能从pdf中获得预期的值和类似的东西,还有什么我需要在rv_continous初始化以便实际工作?

2 个答案:

答案 0 :(得分:3)

由于历史原因,scipy发行版是实例,因此您需要拥有子类的实例。例如:

>>> class MyRV(stats.rv_continuous):
...    def _pdf(self, x, k):
...      return k * np.exp(-k*x)
>>> my_rv = MyRV(name='exp', a=0.)     # instantiation

请注意,需要指定支持的限制:默认值为a=-infb=inf

>>> my_rv.a, my_rv.b
(0.0, inf)
>>> my_rv.numargs        # gets figured out automagically
1

一旦您指定了_pdf,就会有一个有效的分发实例:

>>> my_rv.cdf(4, k=3)
0.99999385578764677
>>> my_rv.rvs(k=3, size=4)
array([ 0.37696127,  1.10192779,  0.02632473,  0.25516446])
>>> my_rv.expect(lambda x: 1, args=(2,))    # k=2 here
0.9999999999999999

答案 1 :(得分:0)

SciPy的rv_histogram方法允许您提供数据,它提供pdf,cdf和随机生成方法。