• Numpy


    在使用numpy时,难免会用到随机数生成器。我一直对np.random.seed(),随机数种子搞不懂。很多博客也就粗略的说,利用随机数种子,每次生成的随机数相同。

    我有两个疑惑:1, 利用随机数种子,每次生成的随机数相同。这是什么意思?

           2,随机数种子的参数怎么选择?在别人的代码中经常看到np.random.seed(Argument),这个参数不一样,有的是0,有的是1,当然还有其他数。那这个参数应该怎么选择呢?

    通过对别的博客的理解,我做了以下几组实验:

    1.以np.random.randn()函数为例

    复制代码
    import numpy as np

    if __name__ == '__main__':
    i = 0
    while(i<6):
    if(i<3):
    np.random.seed(0)
    print(np.random.randn(1, 5))
    else:
    print(np.random.randn(1, 5))
    pass
    i += 1
    i = 0
    while(i<2):
    print(np.random.randn(1, 5))
    i += 1
    print(np.random.randn(2, 5))
    np.random.seed(0)
    i = 0
    while(i<8):
    print(np.random.randn(1, 5))
    i += 1
    复制代码

    结果:

    复制代码

    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
    [[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
    [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
    [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
    [[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
    [[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
    [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]
    [ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]

    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
    [[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
    [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
    [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
    [[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
    [[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
    [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]]
    [[ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]

    复制代码

    通过该实验我们可以得到以下结论:

    1.1.可以看出,像http://blog.csdn.net/linzch3/article/details/58220569这篇博客中提到的,np.random.seed()对后面的随机数一次有效,而不是一直有效,这种说法是错误的。

    两次利用随机数种子后,即便是跳出循环后,生成随机数的结果依然是相同的。第一次跳出while循环后,进入第二个while循环,得到的两个随机数组确实和加了随机数种子不一样。但是,后面的加了随机数种子的,八次循环中的结果和前面的结果是一样的。说明,随机数种子对后面的结果一直有影响。同时,加了随机数种子以后,后面的随机数组都是按一定的顺序生成的。

    1.2.在同样的随机种子后第六次的随机数生成结果,(结果高亮部分),两行五列的数组和两个一行五列的数组结果相同。说明,在生成多行随机数组时,是由单行随机数组组合而成的。

    现在我们回答了第一个疑惑:利用随机数种子,每次生成的随机数相同。这是什么意思? --就是使后面的随机数按一定的顺序生成。

    2.

    复制代码
    import numpy as np
    
    if __name__ == '__main__':
        i = 0
        np.random.seed(0)
        while(i<3):
            print(np.random.randn(1, 5))
            i += 1
        i = 0
        np.random.seed(1)
        i = 0
        while(i<3):
            print(np.random.randn(1, 5))
            i += 1
    复制代码
    复制代码
    [[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799]]
    [[-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]]
    [[ 0.14404357  1.45427351  0.76103773  0.12167502  0.44386323]]
    [[ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763]] [[-2.3015387 1.74481176 -0.7612069 0.3190391 -0.24937038]] [[ 1.46210794 -2.06014071 -0.3224172 -0.38405435 1.13376944]]
    复制代码

    你可以实验,在你的电脑上,当随机数种子参数为0和1时,生成的随机数和我上面高亮的结果相同。说明该参数指定了一个随机数生成的起始位置。每个参数对应一个位置。并且在该参数确定后,其后面的随机数的生成顺序也就确定了。

    所以,现在我们回答了我的第二个疑问:随机数种子的参数怎么选择?我认为随意,这个参数只是确定一下随机数的起始位置。

  • 相关阅读:
    fiddler---Fiddler模拟接口数据(mock)
    Intellij IDEA gradle项目目录介绍
    Windows netstat 查看端口、进程占用
    SpringMVC和spring常见面试题总结
    mybatis一级缓存二级缓存
    Mybatis常见面试题总结
    Spring容器
    深入理解JVM类加载机制
    理解Spring框架中Bean的5个作用域
    编程语言的分类与关系
  • 原文地址:https://www.cnblogs.com/jhui104/p/11460029.html
Copyright © 2020-2023  润新知