我试图找出如何创建一个新的scipy.stats.rv_continuous
子类。 我的分布取决于“位置”和“形状”的参数,但是一个的每一个例子_pdf
在scipy.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))
我希望能够使用loc
为x0
和scale
的s
。 有没有办法做到这一点,还是有更好的方式来继承rv_continuous
?
(注意:仅仅使用PDF作为我定义它会导致其他问题rv_continuous
方法,例如.fit
,因为loc
和scale
仍然视为“自由参数”,即使他们不应该)
你真的不应该尝试改变的意义loc
和scale
。 他们是标准的,定义良好的位置和尺度参数解释,例如,在scipy.stats教程 ,维基百科在这里和这里 ,也是在这里 。
正如我在评论中提到,它看起来像你缺少的因素1/x0
的配方食品中。 没有它,从0到PDF的无穷积分是x0
,而不是1。
与校正,很显然, x0
实际上是尺度参数。 s
是一个形状参数。 像许多其他的发行只在正实轴(例如γ射线或对数正态分布)定义,你可以简单地忽略位置参数-它的默认值是0(如果使用fit
方法时,一定要使用参数floc=0
,以防止的方法,从治疗loc
作为一个自由参数),但我不知道你所说的“X轴位置明确地依赖于分布宽度”的意思-的X轴位置什么 ?
除了沃伦的回答:
在scipy.stats分布假定loc
和scale
是通常的标准化, y = (x - loc) / scale
。 所以你不能继承分布,如果你不遵守这个定义。
然而,你可以写一个新的包装类委托给一个(子)类scipy.stats.distributions,并做任何重新参数化在这个包装类。
在这种情况下,你可以解决像一些参数loc
和调用标准类前更改参数的名称。
创建一个更标准的参数化lognorm包装将使其更容易按照对实施教科书时使用,但不会做任何事情,从什么可以在scipy.stats分布来完成不同的。