在Python中使用逆变换方法生成随机变量

简介: 在Python中使用逆变换方法生成随机变量

目标

在仿真理论中,生成随机变量是最重要的“构建块”之一,而这些随机变量大多是由均匀分布的随机变量生成的。其中一种可以用来产生随机变量的方法是逆变换法。在本文中,我将向您展示如何使用Python中的逆变换方法生成随机变量(包括离散和连续的情况)。

概念

给定随机变量U,其中U在(0,1)中均匀分布。假设我们要生成随机变量X,其中累积分布函数(CDF)为

640.png

逆变换方法的思想是通过如下使用其逆CDF从任何概率分布中生成一个随机数。

640.png

对于离散随机变量,步骤略有不同。假设我们想生成一个离散随机变量X的值,它具有一个概率质量函数(PMF)

640.png

为了生成X的值,需要生成一个随机变量U,U在(0,1)中均匀分布,并且定义

640.png

通过以上步骤,我们可以按如下方法创建逆变换方法的算法。

640.png

连续随机数代码实现

首先,我们实现此方法以生成连续随机变量。假设我们要模拟一个随机变量X,该变量遵循均值λ(即X〜EXP(λ))的指数分布。我们知道指数分布的概率分布函数(PDF)是

640.png

CDF如下

640.png

然后,我们可以使用以下的方法写出逆CDF

640.png

在Python中,我们可以通过如下编写这些代码行来简单地实现它。

###Generateexponentialdistributedrandomvariablesgiventhemean###andnumberofrandomvariablesdefexponential_inverse_trans(n=1,mean=1):
U=uniform.rvs(size=n)
X=-mean*np.log(1-U)
actual=expon.rvs(size=n,scale=mean)
plt.figure(figsize=(12,9))
plt.hist(X, bins=50, alpha=0.5, label="Generated r.v.")
plt.hist(actual, bins=50, alpha=0.5, label="Actual r.v.")
plt.title("Generated vs Actual %i Exponential Random Variables"%n)
plt.legend()
plt.show()
returnX

我们可以通过运行以下示例来尝试上面的代码。请注意,由于我们要生成随机变量,因此结果可能会有所不同。

cont_example1=exponential_inverse_trans(n=100,mean=4)
cont_example2=exponential_inverse_trans(n=500,mean=4)
cont_example3=exponential_inverse_trans(n=1000,mean=4)

640.png

640.png

640.png

看起来很有趣。如果将其与实际变量进行比较,我们可以看到生成的随机变量具有非常相似的结果。可以调整均值(请注意,我为expon.rvs()函数定义的均值是指数分布中的比例参数)和/或 生成的随机变量的数量,以查看不同的结果。

离散随机数实现代码

对于离散随机变量情况,假设我们要模拟遵循以下分布的离散随机变量情况X

640.png

首先,我们编写函数以使用这些代码行为一个样本生成离散随机变量。

###Generatearbitarydiscretedistributedrandomvariablesgiven###theprobabilityvectordefdiscrete_inverse_trans(prob_vec):
U=uniform.rvs(size=1)
ifU<=prob_vec[0]:
return1else:
foriinrange(1,len(prob_vec)+1):
ifsum(prob_vec[0:i])<Uandsum(prob_vec[0:i+1])>U:
returni+1

然后,我们创建一个函数以使用这些代码行生成许多随机变量样本。

defdiscrete_samples(prob_vec,n=1):
sample=[]
foriinrange(0,n):
sample.append(discrete_inverse_trans(prob_vec))
returnnp.array(sample)

最后,我们创建一个函数来模拟结果,并通过这些代码行将其与实际结果进行比较。

defdiscrete_simulate(prob_vec,numbers,n=1):
sample_disc=discrete_samples(prob_vec,n)
unique, counts=np.unique(sample_disc,return_counts=True)
fig=plt.figure()
ax=fig.add_axes([0,0,1,1])
prob=counts/nax.bar(numbers,prob)
ax.set_title("Simulation of Generating %i Discrete Random Variables"%n)
plt.show()
data={'X':unique,'Number of samples':counts,'Empirical Probability':prob,'Actual Probability':prob_vec}
df=pd.DataFrame(data=data)
returndf

我们可以在下面运行一些示例以查看结果。同样,请注意,由于我们要生成随机变量,因此结果可能会有所不同。

prob_vec=np.array([0.1,0.3,0.5,0.05,0.05])
numbers=np.array([1,2,3,4,5])
dis_example1=discrete_simulate(prob_vec, numbers, n=100)
dis_example2=discrete_simulate(prob_vec, numbers, n=500)
dis_example3=discrete_simulate(prob_vec, numbers, n=1000)

640.png

640.png

640.png

In[11]: dis_example1Out[11]:
XNumberofsamplesEmpiricalProbabilityActualProbability0180.080.1012350.350.3023500.500.503450.050.054520.020.05In[12]: dis_example2Out[12]:
XNumberofsamplesEmpiricalProbabilityActualProbability01530.1060.10121590.3180.30232340.4680.5034300.0600.0545240.0480.05In[13]: dis_example3Out[13]:
XNumberofsamplesEmpiricalProbabilityActualProbability011080.1080.10122900.2900.30234910.4910.5034510.0510.0545600.0600.05

结果很有趣!我们可以看到,随着我们增加随机变量样本的数量,经验概率越来越接近实际概率。尝试使用不同数量的样本和/或不同的分布进行实验,以查看不同的结果。

总结

这种逆变换方法是统计中非常重要的工具,尤其是在仿真理论中,在给定随机变量均匀分布在(0,1)中的情况下,我们想生成随机变量。研究案例本身非常广泛,您可以使用在生成经验累积分布函数,预测分析中使用到的这种方法。

目录
相关文章
|
22天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
41 3
|
10天前
|
Python
[oeasy]python050_如何删除变量_del_delete_variable
本文介绍了Python中如何删除变量,通过`del`关键字实现。首先回顾了变量的声明与赋值,说明变量在声明前是不存在的,通过声明赋予其生命和初始值。使用`locals()`函数可查看当前作用域内的所有本地变量。进一步探讨了变量的生命周期,包括自然死亡(程序结束时自动释放)和手动删除(使用`del`关键字)。最后指出,删除后的变量将无法在当前作用域中被访问,并提供了相关示例代码及图像辅助理解。
103 68
|
9天前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
12天前
|
Shell Python
[oeasy]python049_[词根溯源]locals_现在都定义了哪些变量
本文介绍了Python中`locals()`函数的使用方法及其在调试中的作用。通过回顾变量赋值、连等赋值、解包赋值等内容,文章详细解释了如何利用`locals()`函数查看当前作用域内的本地变量,并探讨了变量声明前后以及导入模块对本地变量的影响。最后,文章还涉及了一些与“local”相关的英语词汇,如`locate`、`allocate`等,帮助读者更好地理解“本地”概念在编程及日常生活中的应用。
26 9
|
17天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
81 5
|
26天前
|
算法 决策智能 Python
Python中解决TSP的方法
旅行商问题(TSP)是寻找最短路径,使旅行商能访问每个城市一次并返回起点的经典优化问题。本文介绍使用Python的`ortools`库解决TSP的方法,通过定义城市间的距离矩阵,调用库函数计算最优路径,并打印结果。此方法适用于小规模问题,对于大规模或特定需求,需深入了解算法原理及定制策略。
36 15
WK
|
1月前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
78 36
|
24天前
|
机器学习/深度学习 人工智能 算法
强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用
本文探讨了强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用,通过案例分析展示了其潜力,并讨论了面临的挑战及未来发展趋势。强化学习正为游戏AI带来新的可能性。
65 4
|
24天前
|
Python
Python三引号用法与变量详解
本文详细介绍了Python中三引号(`&quot;&quot;&quot;` 或 `&#39;&#39;&#39;`)的用法,包括其基本功能、如何在多行字符串中使用变量(如f-string、str.format()和%操作符),以及实际应用示例,帮助读者更好地理解和运用这一强大工具。
43 2
|
1月前
|
Python
Python编程中的魔法方法(Magic Methods)
【10月更文挑战第40天】在Python的世界中,魔法方法就像是隐藏在代码背后的神秘力量。它们通常以双下划线开头和结尾,比如 `__init__` 或 `__str__`。这些方法定义了对象的行为,当特定操作发生时自动调用。本文将揭开这些魔法方法的面纱,通过实际例子展示如何利用它们来增强你的类功能。
15 1