Numpy十大随机数生成方法
哈喽,我是小白~
今儿和大家接着之前的Numpy的内容,分享Numpy随机数生成方法。
在机器学习实验中,Numpy 的随机数生成方法对于模型参数初始化、数据集的随机拆分(如训练集和测试集)、以及数据打乱和采样至关重要。正确使用随机数生成可以确保实验结果的稳定性和可复现性。同时,它还能帮助模拟现实中的不确定性,提升模型的泛化能力。
Numpy 提供了丰富的随机数生成方法,这些方法在机器学习、数据科学和其他领域中非常有用。
numpy.random.rand() numpy.random.randn() numpy.random.randint() numpy.random.choice() numpy.random.random() numpy.random.uniform() numpy.random.seed() numpy.random.permutation() numpy.random.normal() numpy.random.beta()
下面,咱们从主要功能、操作语法以及案例详细和大家聊聊~
往期 Numpy 合集
1. numpy.random.rand()
功能:
rand()
函数用于生成一个在 [0, 1) 区间上均匀分布的随机浮点数矩阵。可以指定生成矩阵的形状。
Python 实现:
import numpy as np
# 生成一个 2x3 的矩阵,包含在 [0, 1) 范围内的随机浮点数
random_matrix = np.random.rand(2, 3)
print(random_matrix)
输出示例:
[[0.71339189 0.95231593 0.32428712]
[0.8471983 0.29141687 0.5569511 ]]
应用场景:
这种生成均匀分布随机数的方式经常用于神经网络中初始化权重、数据归一化时的采样等。
2. numpy.random.randn()
功能:
randn()
函数生成一个服从标准正态分布(均值为 0,标准差为 1)的随机浮点数矩阵。它与 rand()
不同的是,生成的数值可以为负。
Python 实现:
# 生成一个 3x2 的矩阵,包含服从标准正态分布的随机浮点数
random_normal_matrix = np.random.randn(3, 2)
print(random_normal_matrix)
输出示例:
[[ 0.9024855 0.23328858]
[-0.89276454 1.67551989]
[-0.20789834 0.23451293]]
应用场景:
常用于生成噪声数据或模拟具有标准正态分布的数据,用于机器学习算法的输入、仿真数据等。
3. numpy.random.randint()
功能:
randint()
用于生成范围内的随机整数。可以指定下限、上限以及生成的整数数量。
Python 实现:
# 生成 5 个在 [0, 10) 区间的随机整数
random_integers = np.random.randint(0, 10, 5)
print(random_integers)
输出示例:
[7 2 4 1 6]
应用场景:
适合用于生成分类问题的标签、打乱数据集时的随机索引、模拟离散数据等。
4. numpy.random.choice()
功能:
choice()
从给定的一维数组或列表中随机选择元素。可以指定是否替换选择,选择的大小等。
Python 实现:
# 从数组中随机选择 3 个元素
array = np.array([1, 2, 3, 4, 5])
random_choices = np.random.choice(array, 3, replace=False)
print(random_choices)
输出示例:
[3 1 4]
应用场景:
主要用于随机抽样、数据集划分(如划分训练集和测试集)、随机生成排列等。
5. numpy.random.random()
功能:
random()
与 rand()
类似,生成一个或多个在 [0, 1) 之间的随机浮点数,但没有直接支持多维数组的语法。
Python 实现:
# 生成一个在 [0, 1) 之间的随机数
random_number = np.random.random()
print(random_number)
输出示例:
0.623462897412345
应用场景:
可以生成随机数作为概率值,或用于归一化任务中的采样。
6. numpy.random.uniform()
功能:
uniform()
生成均匀分布的随机数,允许用户指定上下界,生成的数据在给定范围内。
Python 实现:
# 生成一个在 [5, 10) 之间均匀分布的随机数
uniform_random = np.random.uniform(5, 10, 4)
print(uniform_random)
输出示例:
[5.93519778 8.40129512 9.23767563 7.51273589]
应用场景:
可以用于生成区间内均匀分布的数据,适合蒙特卡洛模拟或参数初始化。
7. numpy.random.seed()
功能:
seed()
用于设置随机数生成器的种子。固定种子可以保证每次运行的随机数序列相同。
Python 实现:
# 设置随机数生成器的种子
np.random.seed(42)
print(np.random.rand(3))
输出示例:
[0.37454012 0.95071431 0.73199394]
应用场景:
在机器学习实验中,固定随机数种子可使实验具有可复现性。
8. numpy.random.permutation()
功能:
permutation()
用于随机排列数组中的元素。对于整数,返回从 0 到 n-1 的随机排列。
Python 实现:
# 对数组进行随机排列
array = np.array([1, 2, 3, 4, 5])
random_permutation = np.random.permutation(array)
print(random_permutation)
输出示例:
[3 1 4 2 5]
应用场景:
数据打乱、交叉验证中数据集的随机划分等。
9. numpy.random.normal()
功能:
normal()
生成服从正态分布的随机数,允许指定均值和标准差。
Python 实现:
# 生成 5 个均值为 0、标准差为 1 的正态分布随机数
normal_random = np.random.normal(0, 1, 5)
print(normal_random)
输出示例:
[-0.76149467 0.45638569 -1.10633497 1.12392399 -0.45608336]
应用场景:
用于模拟自然现象,生成具有指定分布的数据,如误差、测量噪声等。
10. numpy.random.beta()
功能:
beta()
生成 Beta 分布的随机数,常用于贝叶斯统计中。Beta 分布是定义在 [0, 1] 上的概率分布,由两个形状参数 alpha 和 beta 控制。
Python 实现:
# 生成服从 Beta 分布的随机数,α=2, β=5
beta_random = np.random.beta(2, 5, 3)
print(beta_random)
输出示例:
[0.17472959 0.30423646 0.17062353]
应用场景:
常用于贝叶斯推理、参数估计,以及某些强化学习算法中。
有了详细的随机数生成方式的介绍,下面全面的分享一个相关案例,大家有更加深入的理解~
完整案例
案例名称:分析不同分布的随机数生成及其在数据分析中的应用
在这个案例中,我们将:
生成服从 正态分布、均匀分布 和 Beta 分布 的随机数。 计算每种分布的统计属性(如均值、标准差等)。 通过图形展示这些数据集的分布情况,以及它们的累积分布函数(CDF)。
我们绘制以下图形:
直方图:展示不同随机分布的数据分布情况。 累积分布函数(CDF):展示不同分布的累计概率随数据的变化。
Python代码
import numpy as np
import matplotlib.pyplot as plt
# 设置随机数种子以确保结果可复现
np.random.seed(42)
# 生成虚拟数据集
# 正态分布(均值0,标准差1)
normal_data = np.random.normal(0, 1, 1000)
# 均匀分布(范围 [0, 1))
uniform_data = np.random.uniform(0, 1, 1000)
# Beta 分布(alpha=2, beta=5)
beta_data = np.random.beta(2, 5, 1000)
# 统计属性
normal_mean, normal_std = np.mean(normal_data), np.std(normal_data)
uniform_mean, uniform_std = np.mean(uniform_data), np.std(uniform_data)
beta_mean, beta_std = np.mean(beta_data), np.std(beta_data)
# 打印统计信息
print(f"Normal distribution -> Mean: {normal_mean:.2f}, Std: {normal_std:.2f}")
print(f"Uniform distribution -> Mean: {uniform_mean:.2f}, Std: {uniform_std:.2f}")
print(f"Beta distribution -> Mean: {beta_mean:.2f}, Std: {beta_std:.2f}")
# 图形设置
fig, ax = plt.subplots(2, 1, figsize=(10, 8))
fig.suptitle('Random Number Distributions and Cumulative Distribution Functions', fontsize=16)
# 绘制直方图
bins = 30 # 直方图的箱数
ax[0].hist(normal_data, bins=bins, alpha=0.6, color='red', label='Normal Distribution')
ax[0].hist(uniform_data, bins=bins, alpha=0.6, color='blue', label='Uniform Distribution')
ax[0].hist(beta_data, bins=bins, alpha=0.6, color='green', label='Beta Distribution')
ax[0].set_title('Histogram of Different Distributions')
ax[0].set_xlabel('Value')
ax[0].set_ylabel('Frequency')
ax[0].legend()
# 绘制累积分布函数 (CDF)
# 计算每种分布的累积分布函数
normal_data_sorted = np.sort(normal_data)
uniform_data_sorted = np.sort(uniform_data)
beta_data_sorted = np.sort(beta_data)
normal_cdf = np.arange(1, len(normal_data_sorted) + 1) / len(normal_data_sorted)
uniform_cdf = np.arange(1, len(uniform_data_sorted) + 1) / len(uniform_data_sorted)
beta_cdf = np.arange(1, len(beta_data_sorted) + 1) / len(beta_data_sorted)
# 绘制 CDF 曲线
ax[1].plot(normal_data_sorted, normal_cdf, color='red', label='Normal Distribution', linewidth=2)
ax[1].plot(uniform_data_sorted, uniform_cdf, color='blue', label='Uniform Distribution', linewidth=2)
ax[1].plot(beta_data_sorted, beta_cdf, color='green', label='Beta Distribution', linewidth=2)
ax[1].set_title('Cumulative Distribution Function (CDF)')
ax[1].set_xlabel('Value')
ax[1].set_ylabel('Cumulative Probability')
ax[1].legend()
# 显示图形
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()
随机数生成:使用 np.random.normal()
生成正态分布数据,np.random.uniform()
生成均匀分布数据,np.random.beta()
生成 Beta 分布数据。统计属性计算:对生成的数据集计算均值和标准差。 数据可视化:
直方图 展示每个数据集的分布情况,比较不同分布的特点。
累积分布函数 (CDF) 展示随机变量小于或等于某个值的概率累积曲线,直观显示不同分布的特征。
1. 直方图:显示了每种分布中数值出现的频率,帮助我们理解不同分布的形状。
红色表示 正态分布,数据集中在 0 附近,符合标准正态分布的钟形曲线。
蓝色表示 均匀分布,数据在 [0, 1) 区间内均匀分布。
绿色表示 Beta 分布,数据更集中在 0 附近且呈偏态分布。
2. 累积分布函数 (CDF):可以帮助直观地看到不同分布中数值累积的概率变化,提供更多关于数据分布的信息。
正态分布的 CDF 呈现平滑的 S 型曲线。
均匀分布的 CDF 为线性递增,因为每个数据值的出现概率相同。
Beta 分布的 CDF 在 0 附近快速上升,表明 Beta 分布中的小值比例较高。
往期 Numpy 合集
最后