何时使用numpy.random.randn(...)和何时使用numpy.random.rand(...)?

3
在我的深度学习练习中,我需要初始化一个与A1大小相同的参数D1,我所做的是:
D1 = np.random.randn(A1.shape[0],A1.shape[1]) 

但是在计算更多方程后,当我检查结果时发现它们不匹配。在仔细阅读文档后,我发现他们说要使用随机数初始化D1而不是randn

D1 = np.random.rand(A1.shape[0],A1.shape[1]) 

但是他们没有指明其中的原因,因为代码在两种情况下都能工作,并且还有一篇关于该练习的文档,所以我找出了错误,但是如何何时为什么要从这两者中进行选择呢?

1个回答

9
< p > randrandn的区别是(除了字母n),rand返回从[0,1)区间上均匀分布中抽取随机数,而randn则从均值为0、方差为1的正态(又名高斯)分布中抽样。

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

Uniform distribution

在均匀分布中,所有随机值都被限制在特定的区间内,并且均匀地分布在该区间内。如果您使用rand生成了10000个随机数,则会发现其中约有1000个在0到0.1之间,约有1000个在0.1到0.2之间,约有1000个在0.2到0.3之间,以此类推。而且所有这些数字都在0和1之间——您永远不会得到任何超出该范围的数字。

与此同时,randn的分布如下:

Normal distribution

第一个显而易见的区别在于均匀分布和正态分布之间没有上限或下限 - 如果你使用randn生成足够多的随机数,你最终会得到一个像你想要的一样大或小的数(当然,这受存储数字所使用的浮点格式的限制)。但是,你得到的大部分数字仍然非常接近零,因为正态分布不是平坦的:randn的输出更有可能落在0到0.1之间,而不是0.9到1之间,而对于rand,这两个概率是相等的。事实上,正如图片所示,约68%的randn输出落在-1到+1之间,95%的输出落在-2到+2之间,约99.7%的输出落在-3到+3之间。
这些是完全不同的概率分布。如果你将一个替换为另一个,几乎肯定会出现问题。如果代码不仅仅是崩溃,你几乎肯定会得到不正确和/或荒谬的结果。

谢谢,但您能否举个例子说明哪种情况下一个比另一个更适合? - sak
1
如果你需要均匀分布的随机数,那么 rand 更好。如果你需要正态分布的数字,randn 更好。它们是不同的工具,适用于不同的任务。这有点像问哪个更好,锤子还是螺丝刀;这取决于你需要钉钉子还是拧螺丝。 - Ilmari Karonen
请查看此链接 https://pastebin.com/ucN3sJz4,其中的统一性和非统一性在哪里? - sak
@sak:生成更多的值(比如100、1000或10000),并绘制它们的直方图。你会看到它的。 - Ilmari Karonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接