【问题标题】:Loading additional parameters to scipy's rv_continuous将附加参数加载到 scipy 的 rv_continuous
【发布时间】:2021-02-13 08:44:30
【问题描述】:

我打算对连续的、非解析的随机变量做一些基本的代数。我想将它们的概率密度函数定义为数组 x 和 f(x)。

然而,我惊讶地发现似乎没有任何包可以执行基本操作,例如计算两个 pdf 的总和或乘积分布(如果我错了,请纠正我)。为了自己实现这些操作,我计划创建一个 scipy.stats rv_continuous 的子类,遵循this 线程:

import scipy as sp
import numpy as np

class my_pdf(sp.stats.rv_continuous):
    def __init__(self,x,p):
        self.x = x
        self.p = p

    def _pdf(self,x):
        return sp.interpolate.interp1d(self.x,self.p)(x)

x = np.linspace(0,1,101)
f = 3*x**2
my_cv = my_pdf(x,f)
my_cv.pdf(0)

最后一行抛出一个错误,因为覆盖 init 方法可能不是要走的路。除了从头开始构建所有内容之外,有没有办法将额外的参数传递给 rv_continuous,或者解决问题的其他方法?

【问题讨论】:

  • 两个 cmets:(1) 您将希望在覆盖的 __init__ 中调用超级构造函数,如下所示:super().__init__()。 (2) 您的示例可能并不完美,因为从统计的角度来看,支持的积分必须总和为 1 才能成为有效分布:-)
  • (1) 你能详细说明一下吗?据我了解super(),它会调用超类的__init__ 方法,在这种情况下为rv_continuous。但是,我的问题是 rv_continuous 没有采用我需要传递的附加参数。 (2) 如果我将 3*x**2 从 0 整合到 1,我得到 1 :)
  • 我发布了一个我认为可能有用的 sn-p。抱歉,我搞砸了 (2) :-)

标签: python scipy statistics probability probability-density


【解决方案1】:

这似乎对我有用:

import scipy as sp
import scipy.stats
import numpy as np

class my_pdf(sp.stats.rv_continuous):
    def __init__(self,x,p):
        super().__init__(a=x.min(), b=x.max())
        self.x = x
        self.p = p
    
    def _pdf(self,x):
        return sp.interpolate.interp1d(self.x,self.p)(x)

x = np.linspace(0,1,101)
f = 3*x**2
my_cv = my_pdf(x,f)
my_cv.pdf(0)
my_cv.cdf(0.5)

【讨论】:

  • 完美运行,谢谢!您可以通过通过支持限制来摆脱范围检查并提高效率:super().__init__(a=x[0],b=x[-1])。也许您想添加它,因为我无法编辑您的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2017-08-03
  • 2020-10-12
  • 2021-04-27
  • 2015-04-22
相关资源
最近更新 更多