为什么 stats.rv_continuous returns 一直都是相同的值?
Why stats.rv_continuous returns the same value all time?
我有以下代码片段:
from scipy import stats
class my_distribution(stats.rv_continuous):
def __init__(self):
super().__init__(a=0, b=1)
def _cdf(self, x):
return 0.2 * log(x)
def main():
distribution = my_distribution()
val = [distribution.rvs() for i in range(10000)]
sum(val) == 10000 # why !?
有趣的是,对于其他函数(例如均匀分布),我得到了不同的随机值。
In [24]: class distr_gen(stats.rv_continuous):
....: def _pdf(self, x):
....: return 1./(1.2*x)**0.8
....:
In [25]: d = distr_gen(a=0., b=1., name='xxx')
In [26]: d.rvs(size=10)
Out[26]:
array([ 2.41056898e-05, 6.05777448e-04, 7.62206590e-06,
1.46271162e-07, 1.49455630e-05, 6.84527767e-05,
1.62679847e-04, 1.28736701e-05, 4.59315246e-05,
4.15976052e-05])
您的 OP 中的代码存在几个问题:
- cdf与pdf不对应
- cdf(下限)应为 0,cdf(上限)应为 1。您的公式不是这种情况。
有了这么简单的 pdf,您可能最好更正 cdf 集成中的错误并在一张纸上反转 cdf。然后将其作为 ppf
方法添加到您的 class 中。或者如果你只需要随机抽样,就生成一堆均匀的随机数,然后根据你计算出的ppf进行变换。
我有以下代码片段:
from scipy import stats
class my_distribution(stats.rv_continuous):
def __init__(self):
super().__init__(a=0, b=1)
def _cdf(self, x):
return 0.2 * log(x)
def main():
distribution = my_distribution()
val = [distribution.rvs() for i in range(10000)]
sum(val) == 10000 # why !?
有趣的是,对于其他函数(例如均匀分布),我得到了不同的随机值。
In [24]: class distr_gen(stats.rv_continuous):
....: def _pdf(self, x):
....: return 1./(1.2*x)**0.8
....:
In [25]: d = distr_gen(a=0., b=1., name='xxx')
In [26]: d.rvs(size=10)
Out[26]:
array([ 2.41056898e-05, 6.05777448e-04, 7.62206590e-06,
1.46271162e-07, 1.49455630e-05, 6.84527767e-05,
1.62679847e-04, 1.28736701e-05, 4.59315246e-05,
4.15976052e-05])
您的 OP 中的代码存在几个问题:
- cdf与pdf不对应
- cdf(下限)应为 0,cdf(上限)应为 1。您的公式不是这种情况。
有了这么简单的 pdf,您可能最好更正 cdf 集成中的错误并在一张纸上反转 cdf。然后将其作为 ppf
方法添加到您的 class 中。或者如果你只需要随机抽样,就生成一堆均匀的随机数,然后根据你计算出的ppf进行变换。