【问题标题】:When to use numpy.random.randn(...) and when numpy.random.rand(...)?何时使用 numpy.random.randn(...) 以及何时使用 numpy.random.rand(...)?
【发布时间】:2020-01-11 18:25:21
【问题描述】:

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

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

但是在计算了进一步的方程式后,当我检查了它们不匹配的结果之后,在正确阅读了文档后,我发现他们已经说过要使用 rand 而不是 randn;

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

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

【问题讨论】:

    标签: python numpy deep-learning


    【解决方案1】:

    randrandn 之间的区别在于(除了字母 nrand 返回从 uniform distribution 在区间 [0,1) 上采样的随机数,而 randn 则改为采样来自normal (a.k.a. Gaussian) distribution,均值为 0,方差为 1。

    换句话说,rand 产生的随机数的分布是这样的:

    在均匀分布中,所有随机值都被限制在一个特定的区间内,并且均匀分布在该区间内。如果你用rand 生成 10000 个随机数,你会发现其中大约 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 之间。

    这些是完全不同的概率分布。如果你把一个换成另一个,事情几乎肯定会坏掉。如果代码没有简单地崩溃,那么您几乎肯定会得到不正确和/或荒谬的结果。

    【讨论】:

    • 谢谢,但你能举个例子吗?
    • 好吧,如果你需要均匀分布的随机数,那么rand 更好。如果您需要正态分布的数字,randn 更好。它们是用于不同工作的不同工具。这有点像问哪个更好,锤子还是螺丝刀;这取决于您是需要钉钉子还是螺丝钉。
    • 看看这个pastebin.com/ucN3sJz4,哪里是均匀和不均匀?
    • @sak:生成更多值(例如,100 或 1000 或 10000)并绘制其中的 histogram。你会看到的。
    猜你喜欢
    • 2018-04-24
    • 2012-03-13
    • 2015-01-07
    • 2016-09-23
    • 2021-02-09
    • 2019-08-12
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多