我正在使用Python的randn
模块中的normal
和numpy.random
函数。这些函数与我在http://docs.scipy.org手册中读到的函数非常相似(它们都涉及高斯分布),但是我应该注意哪些更微妙的差异?如果是这样,在什么情况下我会更好地使用特定功能?
答案 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中提供的示例时被抓到 此处提供的示例:
此处要注意的一点是,正态分布遵循符号N(均值,方差),而要使用.randn()
实施,则需要乘以标准偏差或 sigma ,然后将平均值或 mu 添加到Numpy方法的标准正常输出中。
注意:
sqrt(方差)=标准偏差或sigma
sqrt(6.25)= 2.5
因此:
sigma * numpy.random.randn(2, 4) + mean