【问题标题】:Meaning of "2 * np.random.rand(100,1)"“2 * np.random.rand(100,1)”的含义
【发布时间】:2020-11-19 04:57:51
【问题描述】:

我是编程初学者。
我尝试在一本书中运行一个简单的线性回归示例。 Y=4*X+6
我已设置np.random.seed(0)
创建X时,书中代码使用2 * np.random.rand(100,1)
我通过以下方式创建了 X1、X2、X3。下面是代码。

import numpy as np

np.random.seed(0)  
X1 = 2 * np.random.rand(5,1)  
X2 = np.random.rand(5,1)  
X3 = 2 * X2  
print('X1= ', X1)  
print('X2= ', X2)  
print('X3= ', X3)  

我在这里有问题。

  1. np.random.rand(100,1) 乘以 2 是什么意思?运行上面代码的结果,似乎不是简单的翻倍数值或者翻倍大小。
  2. 为什么 X1 和 X3 的结果不同?

【问题讨论】:

  • 它应该只是将所有值加倍。
  • X1 和 X3 是不同的,因为每次调用 np.random.rand() 都会得到不同的随机数组。
  • 在分配 X2 之前再次调用np.random.seed(0),然后X1X3 将是相同的。

标签: python numpy random


【解决方案1】:
  1. 它使价值翻倍。你怎么认为它没有?

  2. 它们是不同的,因为您在两个不同的位置调用了一个随机数组。为什么您期望random 在两次连续调用中返回相同的值?那么,这个序列几乎不会是随机的。

【讨论】:

    【解决方案2】:
    In [43]: np.random.seed(0)
        ...: X1 = 2 * np.random.rand(5,1)
        ...: X2 = np.random.rand(5,1)
        ...: X3 = 2 * X2
    
    In [45]: X1
    Out[45]: 
    array([[1.09762701],
           [1.43037873],
           [1.20552675],
           [1.08976637],
           [0.8473096 ]])
    In [46]: X2
    Out[46]: 
    array([[0.64589411],
           [0.43758721],
           [0.891773  ],
           [0.96366276],
           [0.38344152]])
    In [47]: X3
    Out[47]: 
    array([[1.29178823],
           [0.87517442],
           [1.783546  ],
           [1.92732552],
           [0.76688304]])
    

    X2 的值介于 0 和 1 之间。X3 的值是 X2 的两倍,介于 0 和 2 之间。X1 的值是不同的数字,但也在 0 和 2 之间。

    【讨论】:

      【解决方案3】:

      我的猜测是您期望 np.random.rand() 返回相同的值,因为您正在设置种子。这是一种误解。设置种子一次意味着,从它们开始,它将返回一系列随机值。如果您随后再次设置相同的种子,它将随后返回相同的序列。试试这个:

      np.random.seed(0)  
      X1 = np.random.rand(5,1) 
       
      np.random.seed(0)  
      X2 = np.random.rand(5,1) 
      

      X1 将等于 X2,因为每个都是与种子 0 关联的序列的开头。

      现在,试试这个:

      np.random.seed(0)  
      X1 = np.random.rand(5,1) 
      Y1 = np.random.rand(5,1)
       
      np.random.seed(0)  
      X2 = np.random.rand(5,1)
      Y1 = np.random.rand(5,1) 
      

      现在 X1=X2 和 Y1=Y2。但是 X1 != Y1(除非你随机画两次相同的东西)。

      回答你的第一个问题,是的——你将随机抽取的结果乘以 2,所以它现在将返回从 0 到 2 而不是 0 到 1 的元素。

      现在,您可能需要两个相同的随机数生成器,而无需每次都重置种子。如果是这种情况,初始化两个 numpy.random.RandomState: https://numpy.org/doc/stable/reference/random/legacy.html?highlight=numpy%20random%20randomstate#numpy.random.RandomState

      或者他们的新生成器之一。然后你可以用相同的种子初始化它们,并从一个中抽取一段时间,然后从另一个在随机序列中仍然“较早”的种子中抽取。

      【讨论】:

        【解决方案4】:
        1. 乘以 2 的意思是它使 ndarray 中的值加倍(np.random.rand(5,1) 的结果)你永远看不到原始值,你只看到分配给 X1 的加倍值

        2. 如果您调用 np.random.rand(5,1),每次调用时都会得到随机数,因此它们不会经常匹配,因为它们是随机的。

        【讨论】:

          猜你喜欢
          • 2021-11-04
          • 1970-01-01
          • 2021-04-25
          • 1970-01-01
          • 1970-01-01
          • 2022-01-01
          • 2019-02-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多