randn和normal之间的Python差异

randn和normal之间的Python差异,python,numpy,Python,Numpy,我正在使用Python的numpy.random模块中的randn和normal函数。这些函数与我在手册中读到的函数非常相似(它们都与高斯分布有关),但有没有更细微的差异需要我注意?如果是这样,在什么情况下使用特定函数会更好?randn似乎给出了一些标准化正态分布的分布(平均值0和方差1)正常采用更多参数进行更多控制。因此,rand似乎只是一个方便的函数描述 查看您在问题中链接的文档,我将强调一些关键区别: 正常: numpy.random.normal(loc=0.0, scale=1.0,

我正在使用Python的
numpy.random
模块中的
randn
normal
函数。这些函数与我在手册中读到的函数非常相似(它们都与高斯分布有关),但有没有更细微的差异需要我注意?如果是这样,在什么情况下使用特定函数会更好?

randn
似乎给出了一些标准化正态分布的分布(平均值0和方差1)<代码>正常采用更多参数进行更多控制。因此,
rand
似乎只是一个方便的函数

描述 查看您在问题中链接的文档,我将强调一些关键区别:

正常:

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.
因此,在本例中,您将生成一个通用正态分布(稍后将详细说明这意味着什么)

兰登:

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.
在本例中,您正在生成一个特定的正态分布,即标准分布

(简介)数学 现在,一些数学,这是真正需要得到你的问题的核心:

正态分布是一种分布,其中值更可能出现在平均值附近。自然界中有很多这样的案例。例如,达拉斯6月份的平均高温是95华氏度,一年内可能达到100华氏度,甚至105华氏度,但更典型的情况是接近95华氏度或97华氏度。类似地,它可能低至80,但85或90更有可能

因此,它从根本上不同于,比如说,均匀分布(滚动诚实的六面模具)


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

所以

和写作完全一样

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

历史 为了让事情变得更加混乱,如以下所述:

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

问题是真正的专业化:在统计学中,高斯分布非常普遍,以至于出现了一些术语来进行讨论:

  • 许多分布都是高斯分布,以至于高斯分布被认为是正态分布
  • 好的建模,尤其是线性建模,要求所有元素“大小相同”(均值和方差相似)。因此,将分布重新划分为
    平均值=0
    方差=1
    成为标准实践


*最后一点注意:我用“方差”一词从数学上描述了方差。有些人说标准差。方差仅仅等于标准差的平方。由于标准分布的方差=1,在这个标准分布的例子中,
方差==标准偏差

继@Mike Williamson关于方差、标准偏差的解释之后,我被发现试图计算 这里提供的例子是:

>>将numpy作为np导入
>>>2.5*np.随机。随机数n(2,4)+3
数组([-1.13788245,2.54061141,-0.12769502,7.46200906],
[-0.4780766 ,  1.70417835,  5.43802441,  4.71764135]])
这里需要注意的一点是,正态分布遵循符号N(均值,方差),而要使用
.randn()
实现,需要将标准偏差σ相乘,并将均值μ添加到Numpy方法的标准正态输出中

注:

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

例如

sqrt(6.25)=2.5

因此:


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

我觉得它们不一样<代码>正态:从正态(高斯)分布中随机抽取样本
randn
:返回一个随机矩阵,其中包含来自“标准法线”的数据distribution@hughdbrown相同的分布,稍有不同的使用方式。他们最终调用相同的C函数(
rk_gauss
)。我认为,
randn
的存在主要是为了让MATLAB皈依者快乐。MATLAB
randn
似乎或多或少是相同的。啊,它们是在什么文件中定义的?我想是这样的,并在源代码中查找了一些,但我没有找到它。
numpy/random/mtrand/distributions.c
您的答案似乎很有趣。但是,若测量,比如说,是某个物体的速度,那个么如何产生噪声呢?噪波应仅包含正值。。?!如果是这样的话,正态分布就不能产生正值,对吗?我不确定我是否遵循了@Spider。如果我在跟踪你,你也会问值怎么会低于平均值。标准偏差的定义是平均值周围的变化。也就是说,在它上面和下面。这里没有足够的空间来进入它,但是看看,或者,哦,现在我明白你的意思了:是的,一个“速度”(不是速度,它是一个向量)必须只有正数。是的,正态分布允许负数。因此,正如你的直觉已经告诉你的那样,速度并不遵循正态分布。还有许多其他类型的分布,如泊松分布或二项式分布。如何用一些值来缩放randn给出的值,并将其视为sigma?正态分布的定义似乎不允许如此简单的缩放。@Nimi是的,当您执行变量替换时,确实会出现。(特别是阅读链接部分中关于从X到Z的部分,反之亦然。)唯一的“问题”是指数外出现了一个神奇的
1/sigma
。这是对整个积分进行缩放,以使概率密度缩放
sigma * np.random.randn(...) + mu
np.random.normal(loc= mu, scale= sigma, ...)