numpy 随机数生成器在for循环内生成相同的数字

wlwcrazw  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(111)

我已经实现了一个蒙特卡洛策略来估计一个模型的参数,给定一个次优参数的初始点。为了评估这个最优参数周围的不同条件,我使用了numpy.random.uniform(min,max)随机数生成器,如下面的代码所示:

for j in range(iterations): print(" PERFORMING ITERATION: " + str(j+1)+' OF '+ str(iterations) )#+ (" - CASE: " + str(count) + " / " + str(len(aux_it))))
    # WIDE PARAMETRIC SPACE
    parameters = []
    for k in list(ap.keys()):
        p_0 = np.random.uniform(ap[k][0],ap[k][1])
        parameters.append(p_0)

    if True:
        with warnings.catch_warnings():
            warnings.simplefilter('error')
            print('parameters: ',parameters)

            mse,var1,var2 = ridge_mse2(np.array(parameters),tagsUext,P1)

字符串
我注意到从j=1开始,“parameters”的值没有改变。
我只有在开始'for'循环构造'parameters'之前设置随机数生成器的种子时才能解决这个问题,如下面的代码所示:

for j in range(iterations): print(" PERFORMING ITERATION: " + str(j+1)+' OF '+ str(iterations) )#+ (" - CASE: " + str(count) + " / " + str(len(aux_it))))

    # WIDE PARAMETRIC SPACE
    parameters = []
    np.random.seed(j)
    for k in list(ap.keys()):
        p_0 = np.random.uniform(ap[k][0],ap[k][1])
        parameters.append(p_0)
    
    
    if True:
        with warnings.catch_warnings():
            warnings.simplefilter('error')
            print('parameters: ',parameters)
    
            mse,var1,var2 = ridge_mse2(np.array(parameters),tagsUext,P1)


有人能解释一下为什么会这样吗?

sr4lhrrt

sr4lhrrt1#

你的解决方法是在每次迭代开始时用np.random.seed(j)设置一个新的随机种子。这很管用,因为种子基本上设置了生成随机数的起点。不改变种子,你每次都会得到相同的“随机”数。通过每次迭代改变它,你确保你得到了一批新的随机数。而不是使用np.random.uniform,你可能想看看numpy.random.Generatornumpy.random.PCG64,它们是NumPy新的随机数生成系统的一部分。它们更灵活,有一些整洁的功能。
这里有一个简单的例子:

from numpy.random import default_rng

rng = default_rng()  # This creates a new random number generator

for j in range(iterations):
    print("PERFORMING ITERATION: " + str(j+1) + ' OF ' + str(iterations))

    # WIDE PARAMETRIC SPACE
    parameters = []
    for k in list(ap.keys()):
        p_0 = rng.uniform(ap[k][0], ap[k][1])  # Use the new generator
        parameters.append(p_0)

    # and so on....

字符串
这样,你就使用了一种更现代和推荐的方法来生成随机数。它会自动为你处理种子的东西,所以你每次都会得到不同的数字,而不用手动设置种子。

相关问题