我有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'))
据我所知,一切都已正确设置(我已经检查了数学,它也是正确的)。但是,由于某些原因,它只想生成0
和mu
之间的值,而不是生成的明确指定的预期0
和inf
。例如,以下是distribution.rvs(3, 1.6, 10)
(以及PDF)生成的50个点:
这是distribution.rvs(0.6, 0.4, 4.85)
的示例:
为什么我的分配在mu
上被“封顶”?我的rv_continuous
子类设置是否错误?
答案 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。