1

我试图弄清楚如何创建一个新的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))

我希望能够使用locforx0scalefor s。有什么办法可以做到这一点,还是有更好的子类化方法rv_continuous

(请注意,简单地使用我定义的 PDF 会导致其他rv_continuous方法出现问题,例如.fit,因为locscale仍然被视为“自由参数”,即使它们不应该是)

4

2 回答 2

1

你真的不应该尝试改变locand的含义scale。它们是标准的、定义明确的位置和比例参数,例如在scipy.stats 教程、维基百科的此处此处以及此处的说明中。

1/x0正如我在评论中提到的那样,您的公式中似乎缺少一个因素。没有它,您的 PDF 从 0 到无穷大的积分是x0,而不是 1。

通过校正,很明显这x0实际上是比例参数。 s是一个形状参数。像许多其他仅在正实轴上定义的分布(例如伽马或对数正态)一样,您可以简单地忽略位置参数 - 它的默认值为 0。(如果您使用该fit方法,请务必使用参数floc=0, 来防止该方法被loc视为自由参数。)但是,我不确定您所说的“X 轴位置显式取决于分布的宽度”是什么意思——什么的 X 轴位置?

于 2013-06-14T04:42:42.983 回答
1

除了沃伦的回答:

scipy.stats 中的分布假设loc并且scale是通常的标准化,y = (x - loc) / scale. 因此,如果您不遵循该定义,则无法对分布进行子类化。

但是,您可以编写一个新的包装器类,该包装器类委托给 scipy.stats.distributions 的(子)类,并在此包装器类中进行任何重新参数化。

在这种情况下,您可以在调用标准类之前修复一些参数loc,例如更改参数名称。

创建具有更标准参数化的 lognorm 包装器将使其在遵循例如教科书时更容易使用,但不会做任何与 scipy.stats 中的分布不同的事情。

于 2013-06-14T11:25:50.790 回答