【问题标题】:Using the methods of scipy's rv_continuous when creating a cutom continuous distribution在创建自定义连续分布时使用 scipy rv_continuous 的方法
【发布时间】: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 中初始化什么才能使其真正起作用?

【问题讨论】:

  • 你需要为你的类创建一个实例

标签: python numpy scipy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    由于历史原因,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2021-05-13
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      相关资源
      最近更新 更多