randn和normal之间的Python差异

时间:2014-02-12 20:01:38

标签: python numpy

我正在使用Python的randn模块中的normalnumpy.random函数。这些函数与我在http://docs.scipy.org手册中读到的函数非常相似(它们都涉及高斯分布),但是我应该注意哪些更微妙的差异?如果是这样,在什么情况下我会更好地使用特定功能?

3 个答案:

答案 0 :(得分:45)

我是一名有时编码的统计学家,反之亦然,所以这是我能够准确回答的问题。

查看您在问题中链接的文档,我将重点介绍一些主要差异:

正常:

numpy.random.normal(loc=0.0, scale=1.0, size=None)
# Draw random samples from a normal (Gaussian) distribution.

# Parameters :  
# loc : float -- Mean (“centre”) of the distribution.
# scale : float -- Standard deviation (spread or “width”) of the distribution.
# size : tuple of ints -- Output shape. If the given shape is, e.g., (m, n, k), then m * n * k samples are drawn.

因此,在这种情况下,您正在生成 GENERIC 正态分布(稍后会有更多详细信息)。

randn:

numpy.random.randn(d0, d1, ..., dn)
# Return a sample (or samples) from the “standard normal” distribution.

# Parameters :  
# d0, d1, ..., dn : int, optional -- The dimensions of the returned array, should be all positive. If no argument is given a single Python float is returned.
# Returns : 
# Z : ndarray or float -- A (d0, d1, ..., dn)-shaped array of floating-point samples from the standard normal distribution, or a single such float if no parameters were supplied.

在这种情况下,您正在生成 SPECIFIC 正态分布,即标准分布。


现在有一些数学,这是你的问题的核心所在:

正态分布是一种分布,其中值更可能在均值附近发生。本质上有很多这种情况。例如,6月份达拉斯的平均高温,即95华氏度。它可能达到100,甚至一年内平均105,但更典型的是接近95或97.同样,它可能达到低至80,但85或90更有可能。

因此,它与统一分布(滚动诚实的6面模具)有根本的不同。


标准正态分布只是一个正态分布,其中平均值为0,方差(变化的数学项)为1.

所以,

numpy.random.normal(size= (10, 10))

与写作完全相同

numpy.random.randn(10, 10)

因为numpy.random.normal默认值(loc = 0,scale = 1)实际上是标准分布。

让事情变得更加混乱,如numpy random documentation所述:

sigma * np.random.randn(...) + mu

相同
np.random.normal(loc= mu, scale= sigma, ...)

*最后的注释:我使用术语方差来数学地描述变化。有些人说标准偏差。方差简单地等于标准差的平方。由于标准分布的方差= 1,因此在标准分布的情况下为variance == standard deviation

答案 1 :(得分:19)

randn似乎从一些标准化的正态分布(均值0和方差1)给出分布。 normal需要更多参数才能获得更多控制权。所以rand似乎只是一个便利功能

答案 2 :(得分:0)

按照@Mike Williamson关于方差,标准差的解释,我在尝试锻炼Numpy documentation for randn中提供的示例时被抓到 此处提供的示例:

Create (2x4) Array/Matrix whose distribution has Mean = 3, Variance = 6.25

此处要注意的一点是,正态分布遵循符号N(均值,方差),而要使用.randn()实施,则需要乘以标准偏差 sigma ,然后将平均值 mu 添加到Numpy方法的标准正常输出中。

注意:

sqrt(方差)=标准偏差或sigma

sqrt(6.25)= 2.5

因此:

sigma * numpy.random.randn(2, 4) + mean