随机数和随机操作
计算机能模拟随机,是一件十分重要的事。因为计算机本来是一种执行确定步骤,返回确定结果的机器。但是你想要它模拟随机,就得有一些特殊处理。 好在 Python 自己有专门处理随机的功能。而 Numpy 作为 Python 的网红库,当然也自带了很丰富的随机功能。比如各式随机数的生成方式, 随机化当前数列等。甚至你还能加随机,复现一些随机后的结果。
这节内容我们主要包含下面这些功能的学习:
- 多种随机数生成
np.random.rand(), np.random.random()
np.random.randn(), np.random.randint()
- 给你施加随机
np.random.choice()
np.random.shuffle(), np.random.permutation()
- 随机分布
np.random.normal(), np.random.uniform()
- 随机种子的重要性
np.random.seed()
多种随机数生成¶
提到随机,首先我们想到的当然是生成一批随机数,对这批随机数做计算啦。在深度学习中,这是一件非常重要的事,比如你常会随机生成神经网络的权重,生成遗传算法中的基因序列等等。
假设现在没有 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),让电脑可以复现你的随机过程。