scipy.stats种子?

时间:2013-04-15 13:51:09

标签: python random python-2.7 numpy scipy

我正在尝试用不同的种子生成scipy.stats.pareto.rvs(b,loc = 0,scale = 1,size = 1)。

在numpy中我们可以使用numpy.random.seed(seed = 233423)播种。

有没有办法播种由scipy统计数据生成的随机数。

注意:我没有使用numpy pareto,因为我想给出不同的比例值。

4 个答案:

答案 0 :(得分:19)

scipy.stats只使用numpy.random生成随机数,因此numpy.random.seed()也适用于此。如,

import numpy as np
from scipy.stats import pareto
b = 0.9
np.random.seed(seed=233423)
print pareto.rvs(b, loc=0, scale=1, size=5)
np.random.seed(seed=233423)
print pareto.rvs(b, loc=0, scale=1, size=5)

将两次打印[ 9.7758784 10.78405752 4.19704602 1.19256849 1.02750628]

答案 1 :(得分:5)

除了对user5915738的回答(我认为这通常是最好的回答)之外,我想指出一种植入scipy.stats分布的随机生成器的最简便的方法。

您可以在使用rvs方法生成分布时设置种子,方法是将种子定义为整数,该整数用于内部种子np.random.RandomState

uni_int_seed = scipy.stats.uniform(-.1, 1.).rvs(10, random_state=12)

或直接定义np.random.RandomState

uni_state_seed = scipy.stats.uniform(-.1, 1.).rvs(
    10, random_state=np.random.RandomState(seed=12))

这两种方法是等效的:

np.all(uni_int_seed == uni_state_seed)
# Out: True

此方法相对于将其分配给random_staterv_continuous的{​​{1}}的优势在于,您始终可以明确控制rv_discrete的随机状态,而使用rvs的种子在每次调用my_dist.random_state = np.random.RandomState(seed=342423) 后会丢失,因此在失去分配跟踪时可能会导致结果不可重现。
同样根据The Zen of Python

  1. 显式优于隐式。

:)

答案 2 :(得分:4)

对于那些四年后发生在这篇文章上的人,Scipy DOES提供了一种将np.random.RandomState对象传递给其随机变量类的方法,有关详细信息,请参阅rv_continuousrv_discrete。 scipy文档说明了这一点:

  

seed:None或int或numpy.random.RandomState实例,可选

     

此参数定义用于绘制随机变量的RandomState对象。如果为None(或np.random),则使用全局np.random状态。如果是整数,则用于为本地RandomState实例设定种子。默认值为“无”。

不幸的是,在连续/离散rvs子类rv_continuousrv_discrete之后,这个参数似乎不可用。但是,random_state属性确实属于子类,这意味着我们可以在实例化之后使用np.random.RandomState的实例设置种子,如下所示:

import numpy as np
import scipy.stats as stats

alpha_rv = stats.alpha(3.57)
alpha_rv.random_state = np.random.RandomState(seed=342423)

答案 3 :(得分:3)

对于7年后仍在解决这个问题的人来说,numpy随机状态生成器函数发生了重大变化。根据文档herehere,将RandomState类替换为Generator类。 RandomState保证与旧版本/代码兼容,但是不会进行任何实质性的更改,包括算法上的改进,这些保留给Generator

为澄清如何在同一实验中将现有的基于Numpy的随机流传递给Scipy函数,下面给出一些示例和理由,说明为什么需要这种情况以及原因。

from numpy.random import Generator, PCG64
from scipy.stats import binom

n, p, size, seed = 10, 0.5, 10, 12345

# Case 1 : Scipy uses some default Random Generator
numpy_randomGen = Generator(PCG64(seed))
scipy_randomGen = binom
print(scipy_randomGen.rvs(n, p, size))
print(numpy_randomGen.binomial(n, p, size))
# prints
# [6 6 5 4 6 6 8 6 6 4]
# [4 4 6 6 5 4 5 4 6 7]
# NOT DESIRABLE as we don't have control over the seed of Scipy random number generation


# Case 2 : Scipy uses same seed and Random generator (new object though)
scipy_randomGen.random_state=Generator(PCG64(seed))
numpy_randomGen = Generator(PCG64(seed))
print(scipy_randomGen.rvs(n, p, size))
print(numpy_randomGen.binomial(n, p, size))
# prints
# [4 4 6 6 5 4 5 4 6 7]
# [4 4 6 6 5 4 5 4 6 7]
    # This experiment is using same sequence of random numbers, one is being used by Scipy
# and other by Numpy. NOT DESIRABLE as we don't want repetition of some random 
# stream in same experiment.


# Case 3 (IMP) : Scipy uses an existing Random Generator which can being passed to Scipy based 
# random generator object
numpy_randomGen = Generator(PCG64(seed))
scipy_randomGen.random_state=numpy_randomGen
print(scipy_randomGen.rvs(n, p, size))
print(numpy_randomGen.binomial(n, p, size))
# prints
# [4 4 6 6 5 4 5 4 6 7]
# [4 8 6 3 5 7 6 4 6 4]
# This should be the case which we mostly want (DESIRABLE). If we are using both Numpy based and 
#Scipy based random number generators/function, then not only do we have no repetition of 
#random number sequences but also have reproducibility of results in this case.