Numpy随机正态的介绍

174 阅读12分钟

本教程将介绍Numpy随机正态函数(AKA, np.random.normal)。

如果你在Python中做任何种类的统计或数据科学,你经常需要与随机数打交道。 尤其是,你经常需要处理正态分布的数字。

Numpy随机正态函数生成了一个从正态分布中抽取的数字样本,也叫高斯分布。

本教程将向你展示该函数是如何工作的,并将向你展示如何使用该函数。

如果你只是需要一些具体的帮助,你可以通过以下链接跳到相应的章节。

目录。

但如果你对Numpy有点不熟悉,我建议你阅读整个教程。

Numpy随机正态的快速概述

让我们先从高层次解释Numpy随机正态的作用。

对Numpy的快速回顾

让我们简单回顾一下Numpy是什么。

Numpy是Python编程语言的一个模块,用于数据科学和科学计算。

具体来说,Numpy对数字数据进行数据处理。 它使你能够将数字数据收集到一个数据结构中,称为Numpy数组。 它还能让你对Numpy数组进行各种计算和操作。

基本上,Numpy是一个在Python中创建和处理数字数组的工具包。

(关于Numpy数组基础知识的更多细节,请查看我们关于NumPy数组的教程)。

Numpy随机正态生成正态分布的数字

所以Numpy是一个在Python中处理数字数据的包。

np.random.normal在哪里?

正如我之前提到的,Numpy 有各种各样的工具用于处理数值数据。 在大多数情况下,Numpy的工具使你能够做两件事中的一件:创建数字数据(结构为Numpy数组),或者对Numpy数组进行一些计算。

Numpy随机正态函数使你能够创建一个包含正态分布数据的Numpy数组

对正态分布数据的快速回顾

希望你对正态分布数据很熟悉,但作为复习,下面是我们在直方图中绘制数据时的样子。

A simple histogram showing normally distributed data, generated with the numpy random normal function.

正态分布数据的形状有点像钟形,所以它通常被称为 "钟形曲线"。

正态分布的2个重要参数

重要的是,有2个主要参数影响分布的形状。

  • 平均数
  • 标准差

平均值告诉我们分布的峰值在哪里。

An image that shows what the "mean" is in a normal distribution.

标准差衡量数据的 "分散程度"(尽管,还有其他衡量数据分散程度的指标,如方差)。

An image that shows what the "standard deviation" of a normal distribution is.

这些指标都很重要,因为它们直接关系到Numpy随机正态的两个语法参数。

因此,为了将其与np.random.normal联系起来,Numpy随机正态函数允许我们创建正态分布数据,同时指定重要的参数,如平均值和标准差。

考虑到这一点,让我们看一下语法。

Numpy随机正态的语法

Numpy随机正态函数的语法是相当直接的。

请注意,在下面的语法解释中以及本博文的其余部分,我们将假设你已经用以下代码导入了Numpy。import numpy as np. 该代码将使你能够将Numpy称为np

np.random.normal 语法

这里是基本的语法。

An explanation of the syntax of the numpy random normal function.

让我解释一下。

通常情况下,我们会用np.random.normal() 这个名字来调用这个函数。正如我前面提到的,这假定我们已经用代码import numpy as np 来导入Numpy 。

在这个函数中,你会注意到3个参数。loc,scale,size

这些参数允许你分别控制正态分布的平均值、标准差和大小/形状。

让我们来讨论一下这些参数中的每一个。

np.random.normal 函数的参数

np.random.normal 函数有三个主要的参数来控制输出。loc,scale, 和size

我将分别解释这些参数。

loc

loc 参数控制输出数据的平均值。

A visualization that shows how the loc parameter shows the mean of the distribution when using the numpy random normal function.

这个参数的默认值是0 ,所以如果你不使用这个参数来指定分布的平均数,平均数将是0。

(我将在例4中向你展示这个例子)。

规模

scale 参数控制正态分布的标准差。

A visualization that shows how the scale parameter shows the standard deviation of the distribution when using the numpy random normal function.

默认情况下,scale 参数被设置为 1。

(我将在例子5中向你展示这个例子。)

大小

size 参数控制输出的大小和形状。

记住,输出将是一个Numpy数组。 Numpy数组可以是一维的,二维的,或多维的(即2个或更多)。

如果你对Numpy数组不是很熟悉,这可能会让你感到困惑。 要了解更多关于Numpy数组结构的知识,我建议你阅读我们的Numpy数组教程。

说了这么多,这里有一个简单的解释。

你提供给size 参数的参数将决定输出数组的大小和形状。

如果你提供一个单一的整数,x ,np.random.normal将在一个一维的Numpy数组中提供x 随机正态值。

你也可以指定一个更复杂的输出。

例如,如果你指定size = (2, 3) ,np.random.normal将产生一个2行3列的Numpy数组。 它将被填充为从随机正态分布中抽取的数字。

请记住,你可以创建超过2个维度的输出数组,但为了简单起见,我将把它留给另一个教程。

(我将在实例3中向你展示一个参数方面的例子)。

例子:如何使用Numpy的随机正态函数

现在我已经向你展示了Numpy随机正态函数的语法,让我们来看看一些例子,看看它是如何工作的。

例子。

在你运行例子之前,先运行这段代码

在你使用下面的任何例子之前,请确保你运行下面的代码。

import numpy as np

我在本教程的开头简要地解释了这段代码,但它对下面的例子很重要,所以我再解释一下。

代码import numpy as np ,将Numpy模块导入到你的工作环境中,使你能从Numpy中调用函数。 如果你不使用import 语句来导入Numpy,Numpy的函数将无法使用。

此外,通过将Numpy导入为np ,我们给Numpy模块起了一个类似于 "昵称 "的名字。 因此,当我们调用Numpy函数时,我们就可以把Numpy称为np。

如果你以前使用过 Python 模块,你可能会理解这一点,但如果你真的是一个初学者,可能会有点困惑。 所以,我想快速解释一下。

关于Numpy随机种子的简短说明

在这些例子中,你会看到我使用np.random.seed来设置Numpy随机数发生器的种子。

如果你在这些例子中使用与我相同的种子,你应该得到完全相同的输出(但如果你使用不同的种子值,你会得到不同的输出)。

我们经常使用np.random.seed来实现可重复性,特别是在教程的背景下。

如果你想阅读更多关于Numpy随机种子的内容,你可以查看我们关于np.random.seed函数的教程。

好了,现在让我们来操作一些例子。

例1:从正态分布中抽出一个数字

首先,让我们看看一个非常简单的例子。

在这里,我们将使用 np.random.normal 来从正态分布中生成一个单一的观察值。

np.random.normal(1)

这段代码将生成一个从正态分布中抽取的单个数字,其平均值为0,标准差为1。

从本质上讲,这段代码的工作原理与np.random.normal(size = 1, loc = 0, scale = 1) 相同。

记住:如果我们没有为locscale 参数指定值,它们将默认为loc = 0scale = 1

例2:从正态分布中抽出5个数字

现在,让我们从正态分布中抽取5个数字。

这段代码与前面的例子中的代码几乎完全一样。

np.random.normal(5)

在这里,5 的值被传递给size 参数。 它表明我们想产生一个包含5个数值的Numpy数组,从正态分布中抽取。

同时注意,由于我们没有明确指定locscale 的值,它们将默认为loc = 0scale = 1

例3:创建一个正态分布值的二维Numpy数组

现在,我们将创建一个二维的正态分布值数组。

要做到这一点,我们需要向size 参数提供一个值的元组。

np.random.seed(42)
np.random.normal(size = (2, 3))

这就产生了输出。

array([[ 1.62434536, -0.61175641, -0.52817175],
       [-1.07296862,  0.86540763, -2.3015387 ]])

所以我们使用了size 参数和size = (2, 3) 。这产生了一个有6个值的2维Numpy数组。

这个输出数组有2行和3列。 这里,输入元组中的 "2 "指定了行的数量,而 "3 "指定了列的数量。

在这个例子中,我们使用size 参数来创建一个二维数组。但是要注意,你可以使用size 参数来创建更高维度的数组。

例四:生成具有特定平均值的正态分布值

现在,让我们来生成具有特定平均值的正态分布值。要做到这一点,我们将使用loc 参数。

记得在本教程的前面,loc 参数控制了函数从中提取数字的正态分布的平均值。

在这里,我们要将数据的平均数设置为50,语法是loc = 50

np.random.seed(42)
np.random.normal(size = 1000, loc = 50)

完整的数值阵列太大,无法在此显示,但这里是输出的前几个数值。

array([ 50.49671415,  49.8617357 ,  50.64768854,  51.52302986,
        49.76584663,  49.76586304,  51.57921282,  50.76743473,
        49.53052561,  50.54256004,  49.53658231,  49.53427025 
...

你可以一目了然地看到,这些数值大致集中在50左右。 如果你用Numpy的mean函数来计算平均值,你会发现观测值的平均值是50。

例5:生成具有特定标准差的正态分布值

接下来,我们将生成一个具有特定标准差的数值数组。

正如博文前面提到的,我们可以通过使用scale 参数来修改标准差。

在这个例子中,我们将生成1000个标准偏差为100的数值。

np.random.seed(42)
np.random.normal(size = 1000, scale = 100)

而这里是输出的前几个值。

array([  4.96714153e+01,  -1.38264301e+01,   6.47688538e+01,
         1.52302986e+02,  -2.34153375e+01,  -2.34136957e+01,
         1.57921282e+02,   7.67434729e+01,  -4.69474386e+01
...

请注意,我们设置了size = 1000 ,所以代码将生成1000个值。 为了简洁起见,我只显示了前几个值。

这里有点难看出数据是如何分布的,但是我们可以用std() 方法来计算标准差。

np.random.seed(42)
np.random.normal(size = 1000, scale = 100).std()

这就产生了以下结果。

99.695552529463015

如果我们把它四舍五入,就是100。

注意,在这个例子中,我们没有使用loc 参数。 请记住,默认情况下,loc参数被设置为loc = 0 ,所以默认情况下,这个数据是以0为中心的。我们也可以在这里修改loc 参数,但是为了简单起见,我把它保留在默认状态。

例6:使用np.random.normal中loc、scale和size参数的综合例子

让我们再来做一个例子,把所有的部分放在一起。

在这里,我们将创建一个平均值为50、标准差为100的数值数组。

np.random.seed(42)
np.random.normal(size = 1000, loc = 50, scale = 100)

我不会显示这个操作的输出....。我将把它留给你自己来运行。

让我们快速地讨论一下这段代码。 如果你读过本教程中以前的例子,你应该明白这一点。

我们正在用loc 参数定义数据的平均值。 用loc = 50 将数据的平均数设置为50。

我们用scale 参数来定义数据的标准差。 我们已经用代码scale = 100

代码size = 1000 表示我们要创建一个有1000个值的Numpy数组。

关于np.random.normal的常见问题

现在你已经了解了np.random.normal并看到了一些例子,让我们回顾一下关于这个函数的一些常见问题。

经常问的问题。

问题1:np.random.normal和np.random.randn之间有什么区别?

你可能见过一个在 Python 中创建正态分布数据的不同函数,叫做 np.random.randn。

np.random.randn 函数与 np.random.normal 有关,但有一些区别。

就像 np.random.normal 一样,np.random.randn 函数产生了从正态分布中抽取的数字。

主要的区别在于,np.random.randn就像是np.random.normal的一个特例。np.random.randn的操作就像np.random.normal的loc = 0scale = 1

所以这段代码

np.random.seed(1)
np.random.normal(loc = 0, scale = 1, size = (3,3))

与这段代码的操作是一样的。

np.random.seed(1)
np.random.randn(3, 3)

换句话说,np.random.randn是一个特殊的函数,可以从 "标准正态 "分布中生成数据。

如果你有其他问题,请在评论区留下你的问题

有什么是我漏掉的吗?

你是否还对Numpy随机正态的某些具体内容感到困惑?

如果是,请在页面底部的评论区留下你的问题或评论。

如果你想用Python学习数据科学,请学习Numpy

就这样吧。 你可以使用Numpy随机正态函数在Python中创建正态分布数据。

但是如果你真的想在Python中掌握数据科学和分析,你需要更多地了解Numpy。

np.random.normal函数只是Python中更大的数据操作工具包中的一个部分。

说到这里,如果你想了解更多,你可以查看我们的其他Numpy教程,比如。

还有更多...