我的知识记录

digSelf

机器学习基础:通过NumPy生成随机数与样本采样

2021-10-31
机器学习基础:通过NumPy生成随机数与样本采样

在机器学习的任务中,经常需要对某一个集合进行随机采样,而随机采样就需要使用随机数。本节学习的是通过不同的随机分布产生数值或者数组。

产生随机数

使用np.random.randint生成伪随机整数

np.randomNumPy的产生伪随机数的子模块,该模块提供了所有产生伪随机数所需要的所有操作,并将上述操作进行扩展为多维情况。

print(np.random.randint(5))
print(np.random.randint(5))
print(np.random.randint(5, high=6))

random_arr = np.random.randint(-3, high=14,
                               size=(2, 2))
print(repr(random_arr))

np.random.randint有许多参数,其中最重要的分别是第一个参数,high参数以及size参数。第一个参数在未指定high参数时为upper end,即:最大的那一端。需要注意的是,在上述情况下,是不包括upper end的。举个例子,如果为np.random.randint(n),则在[0, n)之间均匀的选择一个整数。

当指定high参数时,第一个参数为lower endhigh指定的数值为upper end,即:[lower_end, upper_end)size参数指定随机生成的结果数组的大小,如:size=(2,2),随机生成一个2行2列的数组。默认情况下,size=1

从给定分布中产生随机数

例如使用np.random.uniform,默认参数下可以从[0.0, 1.0)的均匀分布中产生一个随机实数

print(np.random.uniform())
print(np.random.uniform(low=-1.5, high=2.2))
print(repr(np.random.uniform(size=3)))
print(repr(np.random.uniform(low=-3.4, high=5.9,
                             size=(2, 2))))

如果指定lowhigh,则从[low, high)内随机产生一个实数。

也可以从np.random.normal,即:高斯分布下产生一个随机实数。

print(np.random.normal())
print(np.random.normal(loc=1.5, scale=3.5))
print(repr(np.random.normal(loc=-2.4, scale=4.0,
                            size=(2, 2))))

其中loc指的是均值,也就是高斯分布中的$\mu$;scale指的是标准差,也就是高速分布中的$\sigma$。

随机数种子与打乱给定数组

随机数种子

由于伪随机数的产生依赖于随机数种子,因此对于同一个随机数种子,程序在每次运行时产生的都会是相同的结果,因此可以通过np.random.seed来设置随机数种子。如果把随机数种子比做选择一个骰子的话,那么randint就相当于掷骰子。

np.random.seed(1)
print(np.random.randint(10))
random_arr = np.random.randint(3, high=100,
                               size=(2, 2))
print(repr(random_arr))

# New seed
np.random.seed(2)
print(np.random.randint(10))
random_arr = np.random.randint(3, high=100,
                               size=(2, 2))
print(repr(random_arr))

# Original seed
np.random.seed(1)
print(np.random.randint(10))
random_arr = np.random.randint(3, high=100,
                               size=(2, 2))
print(repr(random_arr))

打乱指定数组

np.radom.shuffle通过我们设置的随机数种子,可以将给定数组进行打乱重组。需要注意的是:这个打乱重组是in-place的,也就是说会直接修改传入的数组;而且,如果我们想要打乱的是多维数组的话,它仅仅打乱第一个维度

vec = np.array([1, 2, 3, 4, 5])
np.random.shuffle(vec)
print(repr(vec))
np.random.shuffle(vec)
print(repr(vec))

matrix = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])
np.random.shuffle(matrix)
print(repr(matrix))

np.random.shuffle(matrix)仅仅打乱第一个维度,也就是对[0, 1, 2]进行打乱,打乱的结果为:

array([[4, 5, 6],
       [7, 8, 9],
       [1, 2, 3]])

从自定义分布中随机选择样本

NumPy也提供了方法从自定义的分布中选择随机样本,使用np.random.choice即可完成上述功能.

colors = ['red', 'blue', 'green']
print(np.random.choice(colors))
print(repr(np.random.choice(colors, size=2)))
print(repr(np.random.choice(colors, size=(2, 2),
                            p=[0.8, 0.19, 0.01])))

np.random.choice的第一个参数是总体的集合,size指定结果数组的大小,而p参数指定总体集合的各个元素的概率分布。

  • 0