np.random.seed()随机数种子学习笔记

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)来说,它们通常依赖于某种特殊的硬件,对环境中一些不可预知的东西进行物理测量,比如光或温度、电噪声、放射性物质。因此,如果一个模块实现了这种算法,那么它将依赖于系统。
也就是说,面对一个随机操作,只要运行环境一致并保证伪随机数生成程序相同,此时设定随机种子一致就可以复现结果。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来包番茄沙司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值