np.random.seed()随机数种子
为什么使用np.random.seed()
在机器学习中,有很多的操作和算法带有一定的随机性,所以在复现时,如果涉及到这些操作或算法,结果就可能产生差异,比如:神经网络中的权重初始化、K-means算法的初始聚类中心的选取、随机森林算法中涉及到的数据或特征抽样、随机抽取样本组成的训练集和测试集。
当需要复现带有一定随机性的一些操作和算法时,就需要用到随机种子来固定随机的结果。
什么是np.random.seed()
计算机中没有完全的随机数,随机数函数都是通过概率分布来产生随机数,不同的seed函数参数修改概率分布函数中的参数,所以会出来不同的随机值。
随机种子生成器,使下一次生成的随机数为由种子数决定的特定的随机数,如果seed中参数为空,则生成的随机数完全随机。
代码理解
①当不使用random.seed()时,每次生成的随机数不同
②使用random.seed()时,每次生成的随机数相同
③但是需要注意的是:但是random.seed()设定的随机种子仅有一次有效,也就是说,第一次调用random时使用的是我们随机数种子给定的初值列表,第二次调用时设置的seed对生成随机数无效。
seed方法的影响效力仅限于下面的第一个random语句。
④但是只要设置了seed,设定该种子产生的列表时,后面的所有随机函数,就会被记录下来,也就是说,可以调用多次np.random.rand来创建该随机数种子的列表。
np.random.seed(0) # 先定义一个随机数种子
print(np.random.rand(5)) # 随机生成5个数
print(np.random.rand(5)) # 再随机生成5个数
# 结果
[0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
[0.64589411 0.43758721 0.891773 0.96366276 0.38344152]
np.random.seed(0) #调用上述随机数种子(对应生成的列表,从第一个数开始)
for i in range(7):
print(np.random.random()) # 随机生成7个数
# 结果
0.5488135039273248
0.7151893663724195
0.6027633760716439
0.5448831829968969
0.4236547993389047
0.6458941130666561
0.4375872112626925
⑤由以下代码可知,我们定义了一个随机数种子,可以调用7次np.random向该种子产生的列表中添加值;而在使用该随机数种子时,我们只能调用一次np.random来选取该列表的值,再次调用时则失效。
np.random.seed(0)
for i in range(7):
print(np.random.random())
# 结果
0.5488135039273248
0.7151893663724195
0.6027633760716439
0.5448831829968969
0.4236547993389047
0.6458941130666561
0.4375872112626925
np.random.seed(0)
print(np.random.rand(2, 3))
print(np.random.rand(1))
# 结果
[[0.5488135 0.71518937 0.60276338]
[0.54488318 0.4236548 0.64589411]]
0.45216841
故对于该函数的使用,可总结为:
①随机数种子相当于给我们一个初值,之后按照固定顺序生成随机数(该随机数种子对应的list);如果使用相同的seed( )值,则每次生成的随机数列表都相同;
②如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
③设置seed()的时,可以调用多次random()向该随机数的列表中添加信息;而再次使用设置的seed()值时,仅一次有效,也就是说调用第二次random()时则脱离该随机数的列表。
④seed方法设立的目的是为了能够实现实验的可重复进行,得到相同的随机值结果。
np.random.seed()的参数
给定的随机数种子可以理解为生成了很大的列表list,然后我们按顺序向其中添加给定值,下次再次调用时,即从初值(list[0])开始顺序调用。
那这个初值是怎么决定的呢,是np.random.seed()中的参数决定,只要每次这个参数相同,那我们的初值就是相同的,种子就是相同的;种子相同,之后长得枝条就是相同的: 即 list 是相同的。
这个参数是人为给定的,可以认为是初值的标志,每次按照这个标志都可以得到相同的初值,但是这个参数必须int类型。
适用情况
我知道当你使用numpy.random.seed(0)时,每次在你自己的电脑上得到的结果都是一样的。我想知道这是否也适用于不同的计算机和不同的numpy安装
这完全取决于numpy random function内部实现的algorithm类型。在numpy的情况下,由pseudo-random number generators(PRNGs)算法操作。这意味着,如果您提供相同的种子(在开始输入时),您将获得相同的输出。如果你改变种子,你会得到不同的结果。所以这种算法不依赖于系统。
但是对于一个true random number generator (TRNG)来说,它们通常依赖于某种特殊的硬件,对环境中一些不可预知的东西进行物理测量,比如光或温度、电噪声、放射性物质。因此,如果一个模块实现了这种算法,那么它将依赖于系统。
也就是说,面对一个随机操作,只要运行环境一致并保证伪随机数生成程序相同,此时设定随机种子一致就可以复现结果。