随机数和随机操作 - Numpy 数据怪兽 | 莫烦Python

随机数和随机操作

作者: 莫烦 编辑: 莫烦 2021-10-16

计算机能模拟随机,是一件十分重要的事。因为计算机本来是一种执行确定步骤,返回确定结果的机器。但是你想要它模拟随机,就得有一些特殊处理。 好在 Python 自己有专门处理随机的功能。而 Numpy 作为 Python 的网红库,当然也自带了很丰富的随机功能。比如各式随机数的生成方式, 随机化当前数列等。甚至你还能加随机,复现一些随机后的结果。

这节内容我们主要包含下面这些功能的学习:

多种随机数生成

提到随机,首先我们想到的当然是生成一批随机数,对这批随机数做计算啦。在深度学习中,这是一件非常重要的事,比如你常会随机生成神经网络的权重,生成遗传算法中的基因序列等等。

假设现在没有 Numpy,我们当然也能用 Python 自带的 random 来解决,但是效率会低不少。 用 Python 自带的 random,大概是怎么用的呢?

Python 的 random 没有考虑数组类型的高效数据结构,所以我们在 array 类型的数据结构时,更喜欢直接用 Numpy 来生成。

np.random.rand() 是一种最方便去生成带 shape 的 [0, 1) 之间取值的 Array。实现同一个目的的还有这样一种写法,功能上没差别,但是就是看你个人习惯了, np.random.random() 用它就是直接传一个 shape 进去。

那除了生成 [0, 1) 之间的随机数,Numpy 还可以生成其他数值,或使用其他生成规则。比如按照标准正态分布去生成。(啥,不想标准正态分布,想要搞点特殊的?后面我接着介绍,客官不急)

上面都是一些小数的生成,我想生成随机整数呢?那就要用到 np.random.randint()

给你施加随机

我们已经可以自动生成一批随机数啦,但是 Numpy 的好用功能可不止有这么一些简单的生成功能哦。它还可以对已有的数据做随机化处理。 比如我想随机从一组数据中选择,我就可以用 np.random.choice()。我之前在做遗传算法的时候, 做基因重组配对,就需要经常使用到这个函数。

没骗你吧,这个功能好用吧。我真的是很常会用到 choice 这个功能。而在机器学习中,你也许会经常在 epoch 迭代训练数据的时候,碰到 shuffle 的概念。 如果你在机器学习中没弄懂没关系,这里给你补充一下。Numpy 里也有 np.random.shuffle() 的功能,就是用来洗牌的。 注意,它会将源数据洗牌重新排列,如果你想保留源数据的话,记得 np.copy(data) 备份一下

还有一个功能,np.random.permutation(), 它实现的是 np.random.shuffle() 的一种特殊形式。可以说是一种简单处理特殊情况的功能。 它有两个方便之处,1. 直接生成乱序的序列号,2. 对数据乱序。

而且相比 np.random.shuffle()permutation 有一个好处,就是可以返回一个新数据,对原本的数据没有影响。而且还可以处理多维数据。

随机分布

对于统计学或者机器学习,我们在生成数据的时候,有时需要按照特定的统计学分布来生成,比如需要一个正态分布的抽样数据,或者均匀分布的数据抽样结果。 又或者是其他更高级的,比如泊松分布等等,都可以用 Numpy 来实现。这里我们只介绍一下在机器学习中比较常用的 正态分布 和 均匀分布。

随机种子的重要性

在机器学习中,我们要对比两种随机初始化模型的优劣,或者在强化学习中要固定随机环境的随机序列,用于复现当前配置的情况,我们通常要做的事情就是伪随机。 简单说,就是每次都是一组随机,但是我可以后续再完整运行一遍一模一样的随机效果。比如生成两遍一模一样的随机序列。

为了达到这个目的,我们要了解 Numpy 中的 random seed 概念,随机种子。当我们把种子固定的时候(用一个数字),同一个种子(数字)产生的随机序列就会一样。

无论你运行多少次上门的代码,你看到的随机结果,都是同一种结果。当你想改变随机种子的时候,可以在 seed() 中传入不同的数字。

有时候我还会这么用,在同一次执行代码时,重新设定种子,让随机在同一次执行中复现。

所以同一份代码,这两次运行,都会是一样的结果。

总结

随机很有趣吧,你不光可以利用 Numpy 来创建很多中不同的随机数,还能对数据做随机化处理,甚至还能当上帝,控制计算机的随机过程(seed),让电脑可以复现你的随机过程。


降低知识传递的门槛

莫烦经常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛免费 奉献我的所学正是受这种态度的影响。 通过 【赞助莫烦】 能让我感到认同,我也更有理由坚持下去。