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

ash*_*ton 0 python arrays random numpy backpropagation

我在一篇有关反向传播的文章中找到了这段代码,但我对它到底是如何工作的感到困惑。文章说如下

“这是我们这个神经网络的权重矩阵。它被称为“syn0”,意味着“突触零”。由于我们只有 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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

该形状(3, 1)为您提供了一个 3 x 1 矩阵;3 行,每行 1 列。那\xe2\x80\x99s只有3个值。

\n\n

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

\n\n

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

\n\n

请参阅numpy.random.random()文档

\n\n
\n

返回半开区间 [0.0, 1.0) 内的随机浮点数。

\n\n

结果来自指定区间内的\xe2\x80\x9c 连续均匀\xe2\x80\x9d 分布。要对 Unif[a, b), b > a 进行采样,请将random_sample(ba) 的输出乘以并加上 a:

\n\n
(b - a) * random_sample() + a\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

(请注意,这np.random.random()是 的别名np.random.random_sample()

\n\n

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

\n\n

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

\n\n
>>> import numpy as np\n>>> np.random.random((3, 1))  # a 3 x 1 matrix of values between 0 and 1\narray([[0.11605033],\n       [0.31756365],\n       [0.4690499 ]])\n>>> 2 * np.random.random((3, 1))  # a 3 x 1 matrix of values between 0 and 2\narray([[1.30127808],\n       [0.3982432 ],\n       [1.96544242]])\n>>> 2 * np.random.random((3, 1)) - 1  # a 3 x 1 matrix of values between -1 and 1\narray([[ 0.39767412],\n       [-0.83410998],\n       [-0.62446309]])\n
Run Code Online (Sandbox Code Playgroud)\n