为什么stats.rv_continuous会一直返回相同的值?

时间:2015-03-18 13:27:48

标签: python python-3.x statistics scipy distribution

我有以下代码段:

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 !?

有趣的是,对于其他功能(例如,均匀分布),我得到不同的随机值。

1 个答案:

答案 0 :(得分:3)

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中的代码有几个问题:

  1. cdf与pdf
  2. 不对应
  3. cdf(下限)应为0,cdf(上限)应为1.您的公式不是这种情况。
  4. 使用pdf这么简单,你可能最好纠正cdf集成中的错误并在一张纸上反转cdf。然后将其作为ppf方法添加到您的班级。或者,如果您只需要随机抽样,只需生成一堆统一的随机数,然后根据您计算的ppf进行变换。