为什么我们将对 numpy.random.random 的调用乘以数字并减去数字?

Why do we multiply calls to numpy.random.random by numbers and subtract numbers?

我在一篇关于反向传播的文章中找到了这段代码,但我对它的工作原理感到困惑。文章是这样说的

"This is our weight matrix for this neural network. It's called "syn0" 意味着 "synapse zero"。由于我们只有 2 层(输入和输出),我们只需要一个权重矩阵来连接它们。它的维度是 (3,1 ) 因为我们有 3 个输入和 1 个输出。"

我想通过输入指定作者指的是数组 "X",输出指的是数组 "Y"。

我的第一个问题是为什么文章声称我们只有 3 个输入。看一眼代码就会发现我们的数组 X 的大小为 4。我是不是误会了什么?

我的第二个问题是为什么要将对 np.random.random() 的调用乘以 2?

感谢您的帮助!

import numpy as np    

X = np.array([ [0,0,1],
               [0,1,1],
               [1,0,1],
               [1,1,1] ])

y = np.array([[0,0,1,1]]).T  

# initialize weights randomly with mean 0
syn0 = 2*np.random.random((3,1)) - 1

形状 (3, 1) 给你一个 3×1 的矩阵; 3 行中的每行 1 列。那只有3个值。

乘法和减法采用 numpy.random.random() 产生的值范围来产生更宽的范围。

random() 始终生成介于 0 和 1 之间的浮点值,并将这些值乘以 2,然后减去 1 意味着您现在的值介于 -1 和 1 之间。

参见 numpy.random.random() documentation:

Return random floats in the half-open interval [0.0, 1.0).

Results are from the “continuous uniform” distribution over the stated interval. To sample Unif[a, b), b > a multiply the output of random_sample by (b-a) and add a:

(b - a) * random_sample() + a

(注意np.random.random()np.random.random_sample()的别名)

因此,要生成 a = -1b = 1 之间的值,您需要乘以 b - a = 2,然后减去 1 (+ -1)。

您可以在交互式会话中尝试 运行 代码:

>>> import numpy as np
>>> np.random.random((3, 1))  # a 3 x 1 matrix of values between 0 and 1
array([[0.11605033],
       [0.31756365],
       [0.4690499 ]])
>>> 2 * np.random.random((3, 1))  # a 3 x 1 matrix of values between 0 and 2
array([[1.30127808],
       [0.3982432 ],
       [1.96544242]])
>>> 2 * np.random.random((3, 1)) - 1  # a 3 x 1 matrix of values between -1 and 1
array([[ 0.39767412],
       [-0.83410998],
       [-0.62446309]])