如何在Python和numpy中生成随机数

2018年07月07日 由 yuxiangyu 发表 791037 0
随机性的使用是机器学习算法配置和评估的重要部分。从神经网络中的权重的随机初始化,到将数据分成随机的训练和测试集,再到随机梯度下降中的训练数据集的随机混洗(random shuffling),生成随机数和利用随机性是必需掌握的技能。

在本教程中,你将了解如何在Python中生成和使用随机数。

完成本教程后,你会学到:

  • 可以通过使用伪随机数生成器在程序中应用随机性。

  • 如何通过Python标准库生成随机数和使用随机性。

  • 如何通过NumPy库生成随机数组。


让我们开始吧。

如何在Python和numpy中生成随机数

教程概述


本教程分为3个部分:

  1. 伪随机数生成器

  2. Python生成随机数

  3. NumPy生成随机数


1.伪随机数生成器


我们注入到程序和算法中的随机性来源于一种被称为伪随机数生成器的数学技巧。

随机数生成器是从真实的随机源生成随机数的系统。经常是物理的东西,比如盖革计数器,其结果会变成随机数。我们在机器学习中不需要真正的随机性。因此,我们可以使用伪随机性。伪随机性是看起来接近随机的数字样本,但是它是使用确定性的过程生成的。

使用伪随机数生成器可以混洗数据并用随机值初始化系数。这种小程序通常是一个可以调用的返回随机数的函数。如果再次调用,他们将返回一个新的随机数。包装函数通常也是可用的,允许你得到整数,浮点,特定分布,特定范围内的随机数等等。

数字按序列生成。序列是确定性的,并以初始数字播种(seed)。如果没有显式地为伪随机数生成器设定种子,那么它可以使用当前系统时间(以秒或毫秒为单位)作为种子。

种子的值无关紧要。你可以选择任何数。重要的是,相同播种过程将导致相同的随机数序列。

让我们通过一些具体的例子进行说明。

2.Python生成随机数


Python标准库有一个名为random的模块,它提供了一组用于生成随机数的函数。

Python使用一种流行且强大的伪随机数生成器,Mersenne Twister。

在本节中,我们将介绍使用标准Python API生成和使用随机数和随机性的一些用例。

播种随机数生成器


伪随机数生成器是一种生成几乎随机数序列的数学函数。

它需要一个参数来启动序列,称为种子。该函数是确定性的,意味着给定相同的种子,它每次都会产生相同的数字序列。种子的选择无关紧要。

seed()函数将播种伪随机数生成器,以整数值作为参数,如1或7.如果seed()函数之前没有使用随机性调用时,默认是使用当前系统时间中从时间起点(1970)开始的毫秒。

下面的示例演示了对伪随机数生成器进行播种,生成一些随机数,并显示重新播种生成器将导致生成相同的数字序列。
# seed the pseudorandom number generator
from random import seed
from random import random
# seed random number generator
seed(1)
# generate some random numbers
print(random(), random(), random())
# reset the seed
seed(1)
# generate some random numbers
print(random(), random(), random())

运行示例,伪随机数生成器的seed值为1,生成3个随机数,重新播种生成器,然后我们看到生成了相同的三个随机数。
0.13436424411240122 0.8474337369372327 0.763774618976614
0.13436424411240122 0.8474337369372327 0.763774618976614

通过设置种子以确保每次生成相同的结果(例如在生产模型中),可以有效地控制随机性。

对于运行实验,使用随机化来控制混杂变量,可以对每个实验运行使用不同的种子。

随机浮点值


可以使用random()函数生成随机浮点值。值将在0和1之间的范围内生成,具体来说是在区间[0,1)中。

值服从均匀分布(uniform distribution),意味着每个值都有相同的机会被选出。

以下是生成10个随机浮点值的示例。
# generate random floating point values
from random import seed
from random import random
# seed random number generator
seed(1)
# generate random numbers between 0-1
for _ in range(10):
value = random()
print(value)

运行该示例,生成并打印每个随机浮点值。
0.13436424411240122
0.8474337369372327
0.763774618976614
0.2550690257394217
0.49543508709194095
0.4494910647887381
0.651592972722763
0.7887233511355132
0.0938595867742349
0.02834747652200631

浮点值可以通过将它们乘以新范围的大小并加上最小值来重新调整到所需范围,如下所示:
scaled value = min + (value * (max - min))

其中min和max分别是所需范围的最小值和最大值,value是随机生成的浮点值,范围在0到1之间。

随机整数值


randint()函数可以生成随机整数值。

此函数有两个参数:生成的整数值的范围的开始和结束。生成的随机整数值的开始和结束范围内,包括范围值的开始和结束,即在区间[start,end]中。随机值从均匀分布抽取。

下面的示例生成10个0到10之间的随机整数值。
# generate random integer values
from random import seed
from random import randint
# seed random number generator
seed(1)
# generate some integers
for _ in range(10):
value = randint(0, 10)
print(value)

运行该示例会生成并打印10个随机整数值。
2
9
1
4
1
7
7
7
10
6

随机高斯值


可以使用gauss()函数从高斯分布中抽取随机浮点值。

这个函数需要两个参数,这些参数对应于控制分布大小的参数,也就是平均值和标准差。

下面的示例生成10个从高斯分布抽取的随机值,平均值为0.0,标准差为1.0。

请注意,这些参数不是值的界限,并且值的扩展将由分布的钟形控制,在这种情况下,比例可能高于和低于0.0。
# generate random Gaussian values
from random import seed
from random import gauss
# seed random number generator
seed(1)
# generate some Gaussian values
for _ in range(10):
value = gauss(0, 1)
print(value)

运行该示例会生成并打印10个高斯随机值。
1.2881847531554629
1.449445608699771
0.06633580893826191
-0.7645436509716318
-1.0921732151041414
0.03133451683171687
-1.022103170010873
-1.4368294451025299
0.19931197648375384
0.13337460465860485

从列表中随机选择


随机数可用于从列表中随机选择一个。

例如,如果列表有10个在0到9之间的项,那么可以生成0到9之间的随机整数,并使用它从列表中随机选择一项。该choice()函数可以实现此功能。选择是的可能性是一样的。

下面的示例生成一个包含20个整数的列表,并给出了从列表中选择一个随机项的示例(共选5次)。
# choose a random element from a list
from random import seed
from random import choice
# seed random number generator
seed(1)
# prepare a sequence
sequence = [i for i in range(20)]
print(sequence)
# make choices from the sequence
for _ in range(5):
selection = choice(sequence)
print(selection)

首先运行该示例打印整数值列表,然后打印从列表中选择五个数。



[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
4
18
2
8
3

列表中的随机子样本


我们可能会需要重复从列表中随机选择项以创建随机选择的子集。

重要的是,一旦从列表中选择了一个项目并将其添加到子集中,就不应再次添加它。这被称为无替换选择(selection without replacement),因为一旦为子集选择了列表中的项,它就不会被放回原始列表(即,不能重新选择)。

使用sample()函数可以完成此功能,这个函数从列表中选择随机样本而不进行替换。该函数需要的参数有列表和子集大小。请注意,这些选过的项实际上并未从原始列表中删除,只是被挑进了列表的副本。

下面的示例演示如何从20个整数的列表中选择五个项组成子集。
# select a random sample without replacement
from random import seed
from random import sample
# seed random number generator
seed(1)
# prepare a sequence
sequence = [i for i in range(20)]
print(sequence)
# select a subset without replacement
subset = sample(sequence, 5)
print(subset)

运行示例打印整数值列表,然后打印选择的随机样本以进行比较。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[4, 18, 2, 8, 3]

随机混洗列表


随机性可用于随机混洗列表,就像洗牌。

可以使用shuffle()函数来洗牌一个列表。shuffle在适当的位置执行,这意味着被用作shuffle()函数的参数的列表被洗牌,而不是副本被洗牌。

下面的示例演示了随机混洗一个整数值列表。
# randomly shuffle a sequence
from random import seed
from random import shuffle
# seed random number generator
seed(1)
# prepare a sequence
sequence = [i for i in range(20)]
print(sequence)
# randomly shuffle the sequence
shuffle(sequence)
print(sequence)

运行该示例首先打印整数列表,然后打印经过随机混洗后的这个列表。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[11, 5, 17, 19, 9, 0, 16, 1, 15, 6, 10, 13, 14, 12, 7, 3, 8, 2, 18, 4]

3.使用NumPy生成随机数


在机器学习中,你也许正在使用如scikit-learn和Keras之类的库。

这些库的内部使用NumPy,这个库可以非常高效地处理数字的向量和矩阵。

NumPy还有自己的伪随机数生成器和封装函数的实现。

NumPy还实现了Mersenne Twister伪随机数生成器。

让我们看几个生成随机数并使用NumPy数组随机性的例子。

播种随机数生成器


NumPy伪随机数生成器与Python标准库伪随机数生成器不同。

需要注意的是,播种Python伪随机数生成器不会影响NumPy伪随机数生成器。它必须单独播种和使用。

seed()函数可以被用于播种的NumPy的伪随机数生成器,需要整数作为seed值。

下面的示例演示了如何为生成器设定seed以及如何重新播种生成器会导致生成相同的随机数序列。
# seed the pseudorandom number generator
from numpy.random import seed
from numpy.random import rand
# seed random number generator
seed(1)
# generate some random numbers
print(rand(3))
# reset the seed
seed(1)
# generate some random numbers
print(rand(3))

运行示例播种伪随机数生成器,打印随机数序列,然后重新播种生成器,显示生成完全相同的随机数序列。
[4.17022005e-01 7.20324493e-01 1.14374817e-04]
[4.17022005e-01 7.20324493e-01 1.14374817e-04]

随机浮点值数组


随机浮点值数组可以使用NumPy函数rand() 生成。

如果未提供参数,则创建单个随机值。当然,也可以指定数组的大小。

下面的示例创建一个服从均匀分布的10个随机浮点值的数组。
# generate random floating point values
from numpy.random import seed
from numpy.random import rand
# seed random number generator
seed(1)
# generate random numbers between 0-1
values = rand(10)
print(values)

运行该示例生成并打印随机浮点值的NumPy数组。
[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01
1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01
3.96767474e-01 5.38816734e-01]

随机整数值数组


可以使用NumPy函数randint()生成随机整数数组。

此函数有三个参数,范围的下界,范围的上界,以及要生成的整数值的数量或数组的大小。随机整数将从均匀分布中抽取,包括下界的值,不包含上界的值,即在区间[lower,upper)中。

下面的示例演示了如何生成随机整数数组。
# generate random integer values
from numpy.random import seed
from numpy.random import randint
# seed random number generator
seed(1)
# generate some integers
values = randint(0, 10, 20)
print(values)

运行该示例将生成并打印一个包含0到10之间的20个随机整数值的数组。
[5 8 9 5 0 0 1 7 6 9 2 4 5 2 4 2 4 7 7 9]

随机高斯值数组


可以使用randn() NumPy函数生成随机高斯值的数组。

此函数使用单个参数来指定结果数组的大小。高斯值是从标准高斯分布中抽取的;这是一个平均值为0.0,标准差为1.0的分布。

下面的示例显示了如何生成随机高斯值数组。
# generate random Gaussian values
from numpy.random import seed
from numpy.random import randn
# seed random number generator
seed(1)
# generate some Gaussian values
values = randn(10)
print(values)

运行该示例生成并打印来自标准高斯分布的10个随机值的数组。
[ 1.62434536 -0.61175641 -0.52817175 -1.07296862  0.86540763 -2.3015387
1.74481176 -0.7612069 0.3190391 -0.24937038]

可以通过将该值乘以标准差并且从期望的缩放分布中加上平均值来缩放来自标准高斯分布的值。如:
scaled value = mean + value * stdev

其中mean和stdev是所需缩放高斯分布的均值和标准差,value是来自标准高斯分布的随机生成值。

混洗NUMPY数组


可以使用NumPy函数shuffle()随机混洗NumPy数组。

下面的示例演示了如何对NumPy数组进行随机混洗。
# randomly shuffle a sequence
from numpy.random import seed
from numpy.random import shuffle
# seed random number generator
seed(1)
# prepare a sequence
sequence = [i for i in range(20)]
print(sequence)
# randomly shuffle the sequence
shuffle(sequence)
print(sequence)

首先运行该示例生成一个包含20个整数值的列表,然后随机混洗并打印混洗后的数组。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[3, 16, 6, 10, 2, 14, 4, 17, 7, 1, 13, 0, 19, 18, 9, 15, 8, 12, 11, 5]

进一步阅读


如果希望深入了解,可以访问如下网址。

总结


在本教程中,你了解了如何在Python中生成和使用随机数。

具体来说,你学到了:

  • 可以通过使用伪随机数生成器在程序中应用随机性。

  • 如何通过Python标准库生成随机数和使用随机性。

  • 如何通过NumPy库生成随机数组。


 
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消