为何numpy随机数生成器在for循环中生成相同参数值?
问题:蒙特卡洛策略中随机参数不再变化的原因
我实现了蒙特卡洛策略,基于次优参数初始点估计模型参数。为评估最优值周边的不同情况,我使用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的值不再变化。直到在构建parameters的for循环前设置随机数种子np.random.seed(j),代码如下:
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)
请问这一现象的原因是什么?
原因分析
- 核心问题出在你调用的
ridge_mse2函数内部:它大概率重置了numpy的随机种子,或者调用了其他会固定/重置随机数生成器状态的代码。 - 第一次迭代(j=0)时,系统默认的随机种子生成了一组随机参数;但
ridge_mse2执行完毕后,随机数生成器的状态被重置为某个固定值(比如种子0),导致后续每次循环调用np.random.uniform时,都是从同一个起点生成随机数,自然得到完全相同的parameters。 - 手动添加
np.random.seed(j)后,每次循环都会用递增的j值作为新种子初始化随机数生成器,覆盖了ridge_mse2内部的种子重置操作,所以每次能生成不同的随机参数。
你可以通过在ridge_mse2调用前后打印np.random.get_state()来验证:对比两次打印的结果,如果状态完全一致,就说明该函数修改了随机数生成器的状态。
内容的提问来源于stack exchange,提问作者Ana Dias
相关产品推荐
相关产品推荐

