在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)中的情况下,我们想生成随机变量。研究案例本身非常广泛,您可以使用在生成经验累积分布函数,预测分析中使用到的这种方法。

目录
相关文章
|
8月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
549 1
|
9月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
309 2
|
9月前
|
调度 Python
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
242 0
|
9月前
|
传感器 大数据 API
Python数字限制在指定范围内:方法与实践
在Python编程中,限制数字范围是常见需求,如游戏属性控制、金融计算和数据过滤等场景。本文介绍了五种主流方法:基础条件判断、数学运算、装饰器模式、类封装及NumPy数组处理,分别适用于不同复杂度和性能要求的场景。每种方法均有示例代码和适用情况说明,帮助开发者根据实际需求选择最优方案。
413 0
|
9月前
|
Python
Python字符串center()方法详解 - 实现字符串居中对齐的完整指南
Python的`center()`方法用于将字符串居中,并通过指定宽度和填充字符美化输出格式,常用于文本对齐、标题及表格设计。
|
8月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
1211 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
9月前
|
机器学习/深度学习 数据采集 算法
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
444 4
|
8月前
|
算法 调度 决策智能
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
240 0
|
9月前
|
机器学习/深度学习 数据采集 TensorFlow
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
476 0
|
10月前
|
数据管理 开发工具 索引
在Python中借助Everything工具实现高效文件搜索的方法
使用上述方法,你就能在Python中利用Everything的强大搜索能力实现快速的文件搜索,这对于需要在大量文件中进行快速查找的场景尤其有用。此外,利用Python脚本可以灵活地将这一功能集成到更复杂的应用程序中,增强了自动化处理和数据管理的能力。
781 0

推荐镜像

更多