Python中的np.random
引言
在数据科学和机器学习领域,随机数在很多问题中起着重要的作用。Python中的NumPy库提供了丰富的随机数生成函数,其中最常用的是np.random
模块。本文将详细介绍np.random
模块的使用方法,包括随机数的生成、分布的模拟、随机数的种子以及异常值的处理等。
1. 随机数生成
1.1 基本的随机数生成函数
NumPy库中的np.random
模块提供了多种生成随机数的函数,最常用的有以下几个:
rand(d0, d1, ..., dn)
:生成一个[0, 1)
之间的随机数,维度为(d0, d1, ..., dn)
。
import numpy as np
# 生成一个随机数
random_number = np.random.rand()
print(random_number)
输出结果:
0.24369812592034635
randn(d0, d1, ..., dn)
:从标准正态分布中生成一个或多个随机数,维度为(d0, d1, ..., dn)
。
# 从标准正态分布中生成一个随机数
random_number = np.random.randn()
print(random_number)
输出结果:
0.2937365969789154
randint(low, high=None, size=None, dtype='l')
:从给定的整数范围内生成随机整数。
# 从整数范围[0, 10)中生成一个随机整数
random_number = np.random.randint(0, 10)
print(random_number)
输出结果:
8
1.2 生成随机数组
除了生成单个随机数之外,NumPy还允许生成多维数组。
random_sample(size=None)
/random(size=None)
:生成一个位于[0, 1)
之间的随机数,维度由参数size
指定。
# 生成一个维度为(2, 3)的随机数组
random_array = np.random.random(size=(2, 3))
print(random_array)
输出结果:
[[0.00552936 0.56766082 0.70323801]
[0.64567149 0.91121106 0.54799059]]
rand(d0, d1, ..., dn)
:和random
函数类似,生成一个维度为(d0, d1, ..., dn)
的随机数组。
# 生成一个维度为(2, 3)的随机数组
random_array = np.random.rand(2, 3)
print(random_array)
输出结果:
[[0.01179631 0.02991918 0.45274041]
[0.05316586 0.40128429 0.07806182]]
2. 分布的模拟
NumPy库的np.random
模块还提供了模拟常见概率分布的函数。这些函数可以用于生成服从指定概率分布的随机数或者用于模拟实验结果。
2.1 均匀分布
均匀分布是指在给定范围内,每个取值的概率相等的分布。在NumPy中,可以使用uniform
函数生成服从[0, 1)
范围上的均匀分布的随机数。
import matplotlib.pyplot as plt
# 生成1000个服从均匀分布的随机数
uniform_numbers = np.random.uniform(size=1000)
# 绘制直方图
plt.hist(uniform_numbers, bins=20)
plt.title('Uniform Distribution')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
2.2 正态分布
正态分布(也称为高斯分布)是自然界中许多随机变量的分布模型。在NumPy中,可以使用normal
函数生成服从指定均值和标准差的正态分布的随机数。
# 生成1000个服从均值为0,标准差为1的正态分布的随机数
normal_numbers = np.random.normal(loc=0, scale=1, size=1000)
# 绘制直方图
plt.hist(normal_numbers, bins=20)
plt.title('Normal Distribution')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
3. 随机数种子
随机数种子(Random Seed)是生成随机数的起始值。在科学研究或者机器学习实验中,为了保证结果的可重复性,往往需要指定随机数种子。
使用NumPy中的random.seed(seed)
函数可以设置随机数种子。
# 设置随机数种子为10
np.random.seed(10)
# 生成三个随机数
random_number_1 = np.random.rand()
random_number_2 = np.random.rand()
random_number_3 = np.random.rand()
print(random_number_1, random_number_2, random_number_3)
输出结果:
0.771320643266746 0.0207519493594015 0.6336482349262754
当不设置种子时,每次运行程序,生成的随机数都会不一样。但如果设置了种子,则每次运行程序生成的随机数是一样的。
4. 处理异常值
在实际的机器学习任务中,我们经常会遇到含有异常值的数据集。NumPy中的np.random
模块还提供了一些函数,可以生成含有异常值的数据。
4.1 正态分布中的异常值
在正态分布中,位于分布两端的值通常被认为是异常值。可以使用normal
函数生成含有异常值的正态分布数据。
# 生成1000个服从均值为0,标准差为1的正态分布的随机数
normal_numbers = np.random.normal(loc=0, scale=1, size=1000)
# 生成50个异常值,服从均值为10,标准差为5的正态分布
outliers = np.random.normal(loc=10, scale=5, size=50)
# 合并正常数据和异常数据
data_with_outliers = np.concatenate((normal_numbers, outliers))
# 绘制直方图
plt.hist(data_with_outliers, bins=50)
plt.title('Normal Distribution with Outliers')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
4.2Poisson分布中的异常值
Poisson分布是用于表示单位时间内随机事件发生次数的概率分布。在NumPy中,可以使用poisson
函数生成服从指定平均值的Poisson分布的随机数。
# 生成1000个服从平均值为5的Poisson分布的随机数
poisson_numbers = np.random.poisson(lam=5, size=1000)
# 生成50个异常值,服从平均值为15的Poisson分布
outliers = np.random.poisson(lam=15, size=50)
# 合并正常数据和异常数据
data_with_outliers = np.concatenate((poisson_numbers, outliers))
# 绘制直方图
plt.hist(data_with_outliers, bins=20)
plt.title('Poisson Distribution with Outliers')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
可以看到,合并了异常值后的Poisson分布图形在平均值附近有明显的峰值,表示了异常值对数据分布的影响。
结论
本文介绍了Python中的np.random
模块,详细解释了随机数的生成、分布的模拟、随机数种子的设置以及异常值的处理等内容。了解并掌握这些方法可以在数据科学和机器学习任务中灵活运用,为问题的分析和建模提供支持。