我正在尝试计算E[f(x)]
某些我根据数据生成/估算的pdf。
它在文档中说:
子类
可以通过子类化rv_continuous类来定义新的随机变量 并重新定义至少_pdf或_cdf方法(规范化为 位置0和比例1)将给出干净的参数(in 介于a和b之间并传递参数检查方法。
如果您的房车的正面参数检查不正确,那么您将 还需要重新定义_argcheck方法。
所以我分组并定义了_pdf,但每当我尝试调用时:
print my_continuous_rv.expect(lambda x: x)
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初始化以便实际工作?
答案 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=-inf
和b=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和随机生成方法。