文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 08:55

关注

[[388329]]

概念

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

 

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

 

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

 

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

 

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

 

连续随机数代码实现

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

 CDF如下 

 

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

 

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

  1. ### Generate exponential distributed random variables given the mean  
  2. ### and number of random variables  
  3. def exponential_inverse_trans(n=1,mean=1):  
  4. U=uniform.rvs(size=n)  
  5. X=-mean*np.log(1-U)  
  6. actual=expon.rvs(size=n,scale=mean)  
  7.  
  8. plt.figure(figsize=(12,9))  
  9. plt.hist(X, bins=50, alpha=0.5, label="Generated r.v.")  
  10. plt.hist(actual, bins=50, alpha=0.5, label="Actual r.v.")  
  11. plt.title("Generated vs Actual %i Exponential Random Variables" %n)  
  12. plt.legend()  
  13. plt.show()  
  14. return X 

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

  1. cont_example1=exponential_inverse_trans(n=100,mean=4)  
  2. cont_example2=exponential_inverse_trans(n=500,mean=4)  
  3. cont_example3=exponential_inverse_trans(n=1000,mean=4) 

    

 

 

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

离散随机数实现代码

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

 

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

  1. ### Generate arbitary discrete distributed random variables given  
  2. ### the probability vector  
  3. def discrete_inverse_trans(prob_vec):  
  4. U=uniform.rvs(size=1)  
  5. if U<=prob_vec[0]:  
  6. return 1  
  7. else:  
  8. for i in range(1,len(prob_vec)+1):  
  9. if sum(prob_vec[0:i])and sum(prob_vec[0:i+1])>U:  
  10. return i+1 

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

  1. def discrete_samples(prob_vec,n=1):  
  2. sample=[]  
  3. for i in range(0,n):  
  4. sample.append(discrete_inverse_trans(prob_vec))  
  5. return np.array(sample) 

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

  1. def discrete_simulate(prob_vec,numbers,n=1):  
  2. sample_disc=discrete_samples(prob_vec,n)  
  3. unique, counts=np.unique(sample_disc,return_counts=True)  
  4.  
  5. fig=plt.figure()  
  6. ax=fig.add_axes([0,0,1,1])  
  7. prob=counts/n  
  8. ax.bar(numbers,prob)  
  9. ax.set_title("Simulation of Generating %i Discrete Random Variables" %n)  
  10. plt.show()  
  11.  
  12. data={'X':unique,'Number of samples':counts,'Empirical Probability':prob,'Actual Probability':prob_vec}  
  13. df=pd.DataFrame(data=data)  
  14. return df 

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

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

  

 
 
  1. In[11]: dis_example1  
  2. Out[11]:  
  3. X Number of samples Empirical Probability Actual Probability  
  4. 0 1 8 0.08 0.10  
  5. 1 2 35 0.35 0.30  
  6. 2 3 50 0.50 0.50  
  7. 3 4 5 0.05 0.05  
  8. 4 5 2 0.02 0.05In[12]: dis_example2  
  9. Out[12]:  
  10. X Number of samples Empirical Probability Actual Probability  
  11. 0 1 53 0.106 0.10  
  12. 1 2 159 0.318 0.30  
  13. 2 3 234 0.468 0.50  
  14. 3 4 30 0.060 0.05  
  15. 4 5 24 0.048 0.05In[13]: dis_example3  
  16. Out[13]:  
  17. X Number of samples Empirical Probability Actual Probability  
  18. 0 1 108 0.108 0.10  
  19. 1 2 290 0.290 0.30  
  20. 2 3 491 0.491 0.50  
  21. 3 4 51 0.051 0.05  
  22. 4 5 60 0.060 0.05 

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

总结 

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

 

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯