什么时候用 numpy.random.randn(...) 什么时候用 numpy.random.rand(...)?

sak*_*sak 3 python numpy deep-learning

在我的深度学习练习中,我必须初始化一个与 A1 大小相同的参数 D1,所以我所做的是:

D1 = np.random.randn(A1.shape[0],A1.shape[1]) 
Run Code Online (Sandbox Code Playgroud)

但是在我检查结果时计算了进一步的方程后,它们不匹配,然后在正确阅读文档后,我发现他们说使用 rand 而不是randn初始化 D1 ;

D1 = np.random.rand(A1.shape[0],A1.shape[1]) 
Run Code Online (Sandbox Code Playgroud)

但是他们没有说明原因,因为代码在这两种情况下都有效,而且该练习还有一个文档,所以我找出了错误,但是如何何时以及为什么从这两者中进行选择?

Ilm*_*nen 7

rand和之间的区别randn是(除了字母nrand返回从区间 [0,1) 上的均匀分布中采样的随机数,而randn不是从均值为 0 且方差为 1的正态(又名高斯)分布中采样。

换句话说,由 产生的随机数的分布rand如下所示:

均匀分布

在均匀分布中,所有随机值都被限制在一个特定的区间内,并且在该区间内均匀分布。如果您使用 生成 10000 个随机数rand,您会发现其中大约 1000 个将介于 0 和 0.1 之间,大约 1000 个介于 0.1 和 0.2 之间,大约 1000 个介于 0.2 和 0.3 之间,依此类推。和所有的人都会在0和1之间-你永远不会得到任何之外的范围。

同时,分布randn如下:

正态分布

均匀分布和正态分布之间第一个明显的区别是正态分布没有上限或下限——如果你用 生成足够多的随机数randn,你最终会得到一个随心所欲的大或小(好吧,主题无论如何,用于存储数字的浮点格式的限制)。但是您将获得的大多数数字仍然相当接近于零,因为正态分布并不平坦: 的输出randn更有可能落在 0 和 0.1 之间,而不是 0.9 和 1 之间,而对于rand这两种可能性都是一样的。事实上,如图所示,大约 68% 的randn输出落在 -1 和 +1 之间,而 95% 落在 -2 和 +2 之间,大约 99.7% 落在 -3 和 +3 之间。

这些是完全不同的概率分布。如果你换另一个,事情几乎肯定会破裂。如果代码不是简单地崩溃,您几乎肯定会得到不正确和/或无意义的结果。