我已经实现了一个蒙特卡洛策略来估计一个模型的参数,给定一个次优参数的初始点。为了评估这个最优参数周围的不同条件,我使用了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)
型
有人能解释一下为什么会这样吗?
1条答案
按热度按时间sr4lhrrt1#
你的解决方法是在每次迭代开始时用
np.random.seed(j)
设置一个新的随机种子。这很管用,因为种子基本上设置了生成随机数的起点。不改变种子,你每次都会得到相同的“随机”数。通过每次迭代改变它,你确保你得到了一批新的随机数。而不是使用np.random.uniform
,你可能想看看numpy.random.Generator
和numpy.random.PCG64
,它们是NumPy新的随机数生成系统的一部分。它们更灵活,有一些整洁的功能。这里有一个简单的例子:
字符串
这样,你就使用了一种更现代和推荐的方法来生成随机数。它会自动为你处理种子的东西,所以你每次都会得到不同的数字,而不用手动设置种子。