随机数生成是数据分析、模拟和机器学习中的重要组成部分。NumPy 提供了强大的随机数生成工具,涵盖了多种常见分布(如正态分布、均匀分布等)。在实际应用中,经常需要根据特定需求创建自定义的随机分布生成器。
在开始创建自定义随机分布之前,了解 NumPy 提供的随机数生成工具是非常重要的。
NumPy 的 numpy.random
模块提供了各种随机分布生成函数,例如:
import numpy as np
# 生成 5 个均匀分布的随机数
uniform_samples = np.random.uniform(0, 1, size=5)
print("均匀分布随机数:", uniform_samples)
# 生成 5 个正态分布的随机数
normal_samples = np.random.normal(loc=0, scale=1, size=5)
print("正态分布随机数:", normal_samples)
这些函数为开发自定义随机分布提供了基础工具,我们可以基于这些分布构建更加复杂的分布生成器。
逆变换采样法利用累积分布函数(CDF)的逆函数生成随机数。
以下是一个创建自定义指数分布随机生成器的示例:
# 自定义指数分布生成器
def custom_exponential(scale, size):
# 使用逆变换公式:x = -scale * log(1 - u)
u = np.random.uniform(0, 1, size)
return -scale * np.log(1 - u)
# 生成 10 个指数分布随机数
samples = custom_exponential(scale=2, size=10)
print("自定义指数分布随机数:", samples)
在上述代码中,指数分布的逆函数被用来生成符合指定分布的随机数。
对于某些分布,可以通过对标准分布进行变换生成自定义分布。
例如,以下代码生成一个对数正态分布的随机数:
# 自定义对数正态分布生成器
def custom_lognormal(mean, sigma, size):
# 标准正态分布转化为对数正态分布
normal_samples = np.random.normal(loc=mean, scale=sigma, size=size)
return np.exp(normal_samples)
# 生成 10 个对数正态分布随机数
samples = custom_lognormal(mean=0, sigma=1, size=10)
print("自定义对数正态分布随机数:", samples)
通过对标准正态分布应用指数函数,我们得到了对数正态分布随机数。
拒绝采样法是一种通用的方法,适合生成复杂分布的随机数。
以下代码展示如何生成一个三角形分布的随机数:
# 自定义三角形分布生成器
def custom_triangle(size):
samples = []
while len(samples) < size:
# 从均匀分布中采样
x = np.random.uniform(0, 1)
y = np.random.uniform(0, 1)
# 拒绝条件:概率密度函数为 f(x) = 2 * (1 - abs(x - 0.5))
if y < 2 * (1 - abs(x - 0.5)):
samples.append(x)
return np.array(samples)
# 生成 10 个三角形分布随机数
samples = custom_triangle(size=10)
print("自定义三角形分布随机数:", samples)
拒绝采样法通过筛选满足概率条件的样本生成目标分布的随机数。
对于未知的概率分布,可以使用经验数据生成自定义分布。
以下代码基于直方图生成随机数:
# 自定义经验分布生成器
def custom_empirical(data, size):
hist, bin_edges = np.histogram(data, bins=10, density=True)
cdf = np.cumsum(hist) / np.sum(hist)
random_values = np.random.uniform(0, 1, size)
indices = np.searchsorted(cdf, random_values)
return np.random.uniform(bin_edges[indices], bin_edges[indices + 1], size)
# 示例数据
data = np.random.normal(0, 1, 1000)
# 基于数据生成随机数
samples = custom_empirical(data, size=10)
print("基于经验分布生成的随机数:", samples)
此方法适合在真实数据上构建分布模型。
验证自定义随机分布是否符合预期,可以通过可视化直方图和概率密度函数进行检查。
例如:
import matplotlib.pyplot as plt
# 可视化自定义指数分布
samples = custom_exponential(scale=2, size=10000)
plt.hist(samples, bins=50, density=True, alpha=0.7, label="Histogram")
# 绘制理论分布
x = np.linspace(0, 10, 100)
pdf = (1 / 2) * np.exp(-x / 2)
plt.plot(x, pdf, label="Theoretical PDF", color="red")
plt.legend()
plt.title("自定义指数分布验证")
plt.show()
通过对比生成的直方图和理论概率密度函数,可以评估自定义分布生成器的正确性。
在某些情况下,可能需要生成符合多种分布的混合分布。
例如,以下代码展示如何创建一个正态分布和均匀分布的混合分布生成器:
# 自定义混合分布生成器
def custom_mixture(size, weights, components):
assert len(weights) == len(components), "权重和分布数目必须一致"
weights = np.array(weights) / np.sum(weights) # 归一化权重
samples = []
for _ in range(size):
# 随机选择分布
choice = np.random.choice(len(weights), p=weights)
samples.append(components[choice]())
return np.array(samples)
# 定义分布组件
def normal_component():
return np.random.normal(0, 1)
def uniform_component():
return np.random.uniform(-2, 2)
# 生成混合分布随机数
samples = custom_mixture(1000, weights=[0.7, 0.3], components=[normal_component, uniform_component])
# 可视化混合分布
plt.hist(samples, bins=50, density=True, alpha=0.7)
plt.title("自定义混合分布")
plt.show()
上述代码通过权重和组件分布的组合生成了混合分布随机数。
本文系统介绍了如何使用 Python 和 NumPy 开发自定义随机分布生成器,包括基于逆变换、变换法、拒绝采样法以及经验分布的采样方法。通过详细的代码示例和实际应用,展示了如何灵活生成满足特定需求的随机分布。在数据模拟、科学计算和机器学习中,自定义随机分布生成器是一种非常实用的工具,希望本文能够在实际工作中提供参考和帮助。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!