子类SciPy的的连续分布(Subclassing scipy's continuous d

2019-10-18 06:12发布

我试图找出如何创建一个新的scipy.stats.rv_continuous子类。 我的分布取决于“位置”和“形状”的参数,但是一个的每一个例子_pdfscipy.stats.distributions假定形状及定位参数可简单地施加到X轴,这对于一些分布的情况下。

例如,一个分配我工作是将X轴位置明确地依赖于分布,即宽度对数正态的修改版本:

def _pdf(self, x, x0, s):
    Px = exp(-(log(x/x0)+s**2/2.)**2 / (2*s**2))
    return Px / (s*x0*sqrt(2*pi))

我希望能够使用locx0scales 。 有没有办法做到这一点,还是有更好的方式来继承rv_continuous

(注意:仅仅使用PDF作为我定义它会导致其他问题rv_continuous方法,例如.fit ,因为locscale仍然视为“自由参数”,即使他们不应该)

Answer 1:

你真的不应该尝试改变的意义locscale 。 他们是标准的,定义良好的位置和尺度参数解释,例如,在scipy.stats教程 ,维基百科在这里和这里 ,也是在这里 。

正如我在评论中提到,它看起来像你缺少的因素1/x0的配方食品中。 没有它,从0到PDF的无穷积分是x0 ,而不是1。

与校正,很显然, x0实际上是尺度参数。 s是一个形状参数。 像许多其他的发行只在正实轴(例如γ射线或对数正态分布)定义,你可以简单地忽略位置参数-它的默认值是0(如果使用fit方法时,一定要使用参数floc=0 ,以防止的方法,从治疗loc作为一个自由参数),但我不知道你所说的“X轴位置明确地依赖于分布宽度”的意思-的X轴位置什么



Answer 2:

除了沃伦的回答:

在scipy.stats分布假定locscale是通常的标准化, y = (x - loc) / scale 。 所以你不能继承分布,如果你不遵守这个定义。

然而,你可以写一个新的包装类委托给一个(子)类scipy.stats.distributions,并做任何重新参数化在这个包装类。

在这种情况下,你可以解决像一些参数loc和调用标准类前更改参数的名称。

创建一个更标准的参数化lognorm包装将使其更容易按照对实施教科书时使用,但不会做任何事情,从什么可以在scipy.stats分布来完成不同的。



文章来源: Subclassing scipy's continuous distributions