作为标题,我正在尝试从自定义的连续概率密度函数生成随机数,这是:
0.001257 *x^4 * e^(-0.285714 *x)
为此,我使用(在python 3上)scipy.stats.rv_continuous
,然后使用rvs()
生成它们
from decimal import Decimal
from scipy import stats
class my_distribution(stats.rv_continuous):
def _pdf(self, x):
return (Decimal(0.001257) *Decimal(x)**(4)*Decimal(np.exp(-0.285714 *x)))
distribution = my_distribution()
distribution.rvs()
注意,我使用Decimal摆脱了OverflowError: (34, 'Result too large')
。
仍然,出现错误RuntimeError: Failed to converge after 100 iterations
。
那里发生了什么?实现我需要做的正确方法是什么?
正如我所看到的,随着x
越来越大,密度函数变得越来越大(实际上,指数值越来越大)。因此,以极大的概率,随机数将太大而无法容纳任何浮点数。您的密度函数在无穷大处有一个“峰值”,SciPy的rv_continuous
显然有麻烦。例如,这与在0处具有单个峰的密度函数相反。 (一个示例是指数分布,其中峰位于0处,而不是无穷大。)