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

AiTechYun

编辑:yxy

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

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

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

  • 可以通过使用伪随机数生成器在程序中应用随机性。
  • 如何通过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 randomimport seed
from randomimport 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 randomimport seed
from randomimport 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 randomimport seed
from randomimport 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 randomimport seed
from randomimport 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 randomimport seed
from randomimport choice
# seed random number generator
seed(1)
# prepare a sequence
sequence= [ifor iin 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 randomimport seed
from randomimport sample
# seed random number generator
seed(1)
# prepare a sequence
sequence= [ifor iin 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 randomimport seed
from randomimport shuffle
# seed random number generator
seed(1)
# prepare a sequence
sequence= [ifor iin 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.randomimport seed
from numpy.randomimport 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.randomimport seed
from numpy.randomimport 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.randomimport seed
from numpy.randomimport 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.randomimport seed
from numpy.randomimport 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.randomimport seed
from numpy.randomimport shuffle
# seed random number generator
seed(1)
# prepare a sequence
sequence= [ifor iin 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]

进一步阅读

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

  • https://en.wikipedia.org/wiki/Pseudorandom_number_generator
  • https://docs.scipy.org/doc/numpy/reference/routines.random.html
  • https://docs.python.org/3/library/random.html
  • https://machinelearningmastery.com/randomness-in-machine-learning/

总结

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

具体来说,你学到了:

  • 可以通过使用伪随机数生成器在程序中应用随机性。
  • 如何通过Python标准库生成随机数和使用随机性。
  • 如何通过NumPy库生成随机数组。

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2018-07-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

从 Encoder 到 Decoder 实现 Seq2Seq 模型

前言 好久没有更新专栏,今天我们来看一个简单的Seq2Seq实现,我们将使用TensorFlow来实现一个基础版本的Seq2Seq,主要帮助理解Seq2Se...

62113
来自专栏各种机器学习基础算法

NLTK学习笔记(一)

len(text)  #单词个数 set(text)  #去重 sorted(text) #排序 text.count('a') #数给定的单词的个数 text...

2876
来自专栏大数据挖掘DT机器学习

详细介绍tensorflow 神经网络分类模型构建全过程:以文本分类为例

许多开发者向新手建议:如果你想要入门机器学习,就必须先了解一些关键算法的工作原理,然后再开始动手实践。但我不这么认为。 我觉得实践高于理论,新手首先要做的是了解...

7887
来自专栏余林丰

13.高斯消去法(2)——三角矩阵

  对于矩阵有一类特殊的矩阵,叫做三角矩阵。 ?   这种矩阵如果还是按照定义一个二维数组来对数值进行存储的话,无疑将消耗掉不必要的空间,所以我们采用压缩存储的...

2409
来自专栏专知

【Keras教程】用Encoder-Decoder模型自动撰写文本摘要

【导读】这篇博文介绍了如何在深度学习框架Keras上实现文本摘要问题,探讨了如何使用编码器-解码器递归神经网络体系结构来解决文本摘要问题,如何实现文本摘要问题的...

9455
来自专栏程序员叨叨叨

8.4 CG 标准函数库

和 C 的标准函数库类似,Cg 提供了一系列内建的标准函数。这些函数用于执行数学上的通用计算或通用算法(纹理映射等),例如,需要求取入射光线的反射光线方向向量可...

2785
来自专栏数据结构与算法

学大伟业 国庆Day2

期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) 【问题描述】 小Q是一名酷爱钩爪的忍者,...

5084
来自专栏量化投资与机器学习

从Encoder到Decoder实现Seq2Seq模型(算法+代码)

知乎专栏:机器不学习 作者:天雨栗 | 蚂蚁金服 | 数据算法 已授权刊登 前言 好久没有更新专栏,今天我们来看一个简单的Seq2Seq实现,我们将使用Tens...

8656
来自专栏决胜机器学习

从机器学习学python(四) ——numpy矩阵基础

从机器学习学python(四)——numpy矩阵基础 (原创内容,转载请注明来源,谢谢) 一、numpy中matrix 和 array的区别 ...

4807
来自专栏李智的专栏

Deep learning基于theano的keras学习笔记(2)-泛型模型(含各层的方法)

  我们希望预测Twitter上一条新闻会被转发和点赞多少次。模型的主要输入是新闻本身(一个词语序列)。但我们还可以拥有额外的输入(如新闻发布的日期等)。这个模...

981

扫码关注云+社区

领取腾讯云代金券