为什么这个scipy.stats.rv_continuous的子类不能在正确的范围内生成随机变量?

时间:2019-03-19 01:23:35

标签: python random scipy

我有scipy.stats.rv_continuous的以下子类:

from scipy.stats import rv_continuous
import math

class Distribution(rv_continuous):
    def _cdf(self, x, a, b, mu):
        return (
            math.erf(x/(math.sqrt(2)*a)) + \
            math.erf((x - mu)/(math.sqrt(2)*b)) \
            ) / 2 + math.erf(mu/(math.sqrt(2)*b)) / 2

distribution = Distribution(a = 0, b = float('inf'))

据我所知,一切都已正确设置(我已经检查了数学,它也是正确的)。但是,由于某些原因,它只想生成0mu之间的值,而不是生成的明确指定的预期0inf 。例如,以下是distribution.rvs(3, 1.6, 10)(以及PDF)生成的50个点:

enter image description here

这是distribution.rvs(0.6, 0.4, 4.85)的示例:

enter image description here

为什么我的分配在mu上被“封顶”?我的rv_continuous子类设置是否错误?

1 个答案:

答案 0 :(得分:4)

您对CDF的实现不正确。考虑:

In [188]: distribution.cdf(25, 3, 16., 10)
Out[188]: 1.059763759070757

In [189]: distribution.cdf(40, 3, 16., 10)
Out[189]: 1.203618109186038

这些值不正确。 CDF(您在_cdf方法中实现的)不得超过1.0。