【Python算法】生成特定分布随机数的方法-经管之家官网!

人大经济论坛-经管之家 收藏本站
您当前的位置> 会计>>

会计库

>>

【Python算法】生成特定分布随机数的方法

【Python算法】生成特定分布随机数的方法

发布:698348 | 分类:会计库

关于本站

人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!

经管之家新媒体交易平台

提供"微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯"等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

提供微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

【Python算法】生成特定分布随机数的方法生成随机数是程序设计里常见的需求。一般的编程语言都会自带一个随机数生成函数,用于生成服从均匀分布的随机数。不过有时需要生成服从其它分布的随机数,例如高斯分布或指数 ...
坛友互助群


扫码加入各岗位、行业、专业交流群


【Python算法】生成特定分布随机数的方法


生成随机数是程序设计里常见的需求。一般的编程语言都会自带一个随机数生成函数,用于生成服从均匀分布的随机数。不过有时需要生成服从其它分布的随机数,例如高斯分布或指数分布等。有些编程语言已经有比较完善的实现,例如Python的NumPy。这篇文章介绍如何通过均匀分布随机数生成函数生成符合特定概率分布的随机数,主要介绍Inverse Ttransform和Acceptance-Rejection两种基础算法以及一些相关的衍生方法。下文我们均假设已经拥有一个可以生成0到1之间均匀分布的随机数生成函数,关于如何生成均匀分布等更底层的随机数生成理论,请参考其它资料,本文不做讨论。
基础算法

InverseTransform Method
最简单的生成算法是Inverse Transform Method(下文简称ITM)。如果我们可以给出概率分布的累积分布函数(下文简称CDF)及其逆函数的解析表达式,则可以非常简单便捷的生成指定分布随机数。
ITM算法描述
生成一个服从均匀分布的随机数U~Uni(0,1)
设F(X)为指定分布的CDF,F−1(Y)是其逆函数。返回X=F−1(U)作为结果
ITM算法说明
这是一个非常简洁高效的算法,下面说明其原理及正确性。
我们通过图示可以更直观的明白算法的原理。下图是某概率分布的CDF:
我们从横轴上标注两点xa和xb,其CDF值分别为F(xa)和F(xb)。
由于U服从0到1之间的均匀分布,因此对于一次U的取样,U落入F(xa)和F(xb)之间的概率为:
而由于CDF都是单调非减函数,因此这个概率同时等于X落入xa和xb之间的概率,即:
而根据CDF的定义,这刚好说明XX服从以F(x)为CDF的分布,因此我们的生成算法是正确的。
ITM实现示例
下面以指数分布为例说明如何应用ITM。
首先我们需要求解CDF的逆函数。我们知道指数分布的CDF为
通过简单的代数运算,可以得到其逆函数为
由于UU服从从0到1的均匀分布蕴含着1−U服从同样的分布,因此在实际实现时可以用Y代替1−Y,得到:
下面给出一个Python的实现示例程序。
Acceptance-RejectionMethod
一般来说ITM是一种很好的算法,简单且高效,如果可以使用的话,是第一选择。但是ITM有自身的局限性,就是要求必须能给出CDF逆函数的解析表达式,有些时候要做到这点比较困难,这限制了ITM的适用范围。
当无法给出CDF逆函数的解析表达式时,Acceptance-RejectionMethod(下文简称ARM)是另外的选择。ARM的适用范围比ITM要大,只要给出概率密度函数(下文简称PDF)的解析表达式即可,而大多数常用分布的PDF是可以查到的。
ARM算法描述
1.设PDF为f(x)f(x)。首先生成一个均匀分布随机数X~Uni(xmin,xmax)
2.独立的生成另一个均匀分布随机数Y~Uni(ymin,ymax)
3.如果Y≤f(X),则返回X,否则回到第1步
ARM算法说明
通过一幅图可以清楚的看到ARM的工作原理。
ARM本质上是一种模拟方法,而非直接数学方法。它每次生成新的随机数后,通过另一个随机数来保证其被接受概率服从指定的PDF。
显然ARM从效率上不如ITM,但是其适应性更广,在无法得到CDF的逆函数时,ARM是不错的选择。
ARM实现示例
下面使用ARM实现一个能产生标准正态分布的随机数生成函数。
首先我们要得到标准正态分布的PDF,其数学表示为:
为了方便,这里我会直接使用SciPy来计算其PDF。
程序如下。
注意:标准正态分布的x取值范围从理论上说是(−∞,∞),但是当离开均值点很远后,其概率密度可忽略不计。这里只取(−3.0,3.0),实际使用时可以根据具体需要扩大这个取值范围。
衍生算法
组合算法
当目标分布可以用其它分布经过四则运算表示时,可以使用组合算法生成对应随机数。
最常见的就是某分布可以表示成多个独立同分布(下文简称IID)随机变量之和。例如二项分布可以表示成多个0-1分布之和,Erlang分布可以由多个IID的指数分布得出。
以Erlang分布为例说明如何生成这类随机数。
设X1,X2,⋯,Xk为服从0到1均匀分布的IID随机数,则
为服从指数分布的IID随机数,因此
所以生成Erlang分布随机数的算法如下:
这类分布的随机数生成算法很直观,就是先生成相关的n个IID随机数,然后带入简单求和公式或其它四则公式得出最终随机数。其数学理论基础是卷积理论,稍微有些复杂,这里不再讨论,有兴趣的同学可以查阅相关资料。
生成具有相关性的随机数
现在考虑生成多维随机数,以最简单的二维随机数为例。
如果两个维度的随机数是相互独立的,那么只要分别生成两个列就可以了。但是如果要求两列具有一定的相关系数,则需要做一些特殊处理。
下列算法可以生成两列具有相关系数ρ的随机数。
1.生成IID随机变量X和Y
2.计算
3.返回(X,X′)
可以这样验证其正确性:
注意:
因此X和X′确实具有相关系数ρ。
更多参考
这篇文章讨论了生成指定分布随机数的基本方法。这篇文章只打算讨论基础方法,所以还有很多有趣的内容,本文没有深入的探讨。这里给出一些扩展阅读资料,供有兴趣的朋友深入学习。首先是一篇非常好的文档,这篇文章来自美国陆军实验室,对计算机生成指定分布随机数的方方面面进行了全面深入描述,是不可多得的好资料。
在实现方面,可以参考NumPy中关于random的实现以及我开发的JavaScript实现。另外我做过一个不同概率分布的可视化页面,可以帮助你直观理解不同分布及PDF参数对分布的影响。
扫码或添加微信号:坛友素质互助


「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
本文关键词:

本文论坛网址:https://bbs.pinggu.org/thread-5989013-1-1.html

人气文章

1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
经管之家 人大经济论坛 大学 专业 手机版