【发布时间】:2014-05-16 06:25:01
【问题描述】:
我正在尝试为我从数据生成/估计的一些 pdf 计算 E[f(x)]。
它在文档中说:
子类化
可以通过子类化 rv_continuous 类来定义新的随机变量 并至少重新定义 _pdf 或 _cdf 方法(标准化为 位置 0 和比例 1)将给出干净的参数(在 在 a 和 b) 之间传递参数检查方法。
如果您的 RV 的肯定参数检查不正确,那么您将 还需要重新定义_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 中初始化什么才能使其真正起作用?
【问题讨论】:
-
你需要为你的类创建一个实例