统计学 - 非标准分布随机数生成 |
最近做了几道有关随机数生成的实验,记录下来写个总结吧,其中核心证明略。
—— 2020.3.24: 20:50
首先明白一些概念,这里随机数是指服从某种分布的随机变量,比如高斯(标准正态)分布 X~U(0,1)。如果已知随机变量的概率密度函数pdf,进而可以由积分得出其累积概率分布函数CDF,CDF只增不减,最大为1。
明白以上之后,我们就需要来验证或者说如何说明概率密度函数与随机变量的关系?你给我了概率密度函数f(x),如果我知道了随机变量x的取值,那么我就可以知道这个点的概率p,但是你给了这个函数公式说是这个概率就一定是这个概率吗,怎么验证呢?
我们使用采样的方法,我们可以画出概率密度函数曲线图,对于某个概率,在多种可能的采样情况下,如果这个概率下所采集到的样本点相对总体样本点就是这个比例,这个问题不就可以直观说明了。即,某个点的概率越大,那么这个点所采集的样本数也应该越多。
那么,如何得到这些采样点呢,这便是标题所讲的随机数生成。
逆变换ITM
定理:
- 设随机变量Y的分布函数为F(y)是连续函数,而U是(0,1)上均匀分布的随机变量。另X=F-1(U),则X和Y具有相同的分布。
这个有什么意义呢?如果我们知道了U的分布情况,那么其反函数的分布不就是我们要求的随机数嘛。故根据反函数,随机生成U,解出对应的X,再画出X的分布情况,这个其实就是Y的概率密度函数。
但是,这个方法有个缺陷在于要求F是可逆的。
来看一道练习:
上图中红色曲线便是f(x)的概率分布曲线图,而蓝色曲线是逆变换后样本点的分布图,可以看出趋势是一致的。
代码实现
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import math
def EX1_ITM(maxCnt=50000): # 逆变换随机变量,采样点可调
X_u=[] # 用服从均匀分布的u来生成逆随机数
for i in range(maxCnt):
u=np.random.random() # 生成[0.0,1.0)之间的随机数
if u>=0 and u<0.25: # 逆变换
X_u.append(np.sqrt(u)/2)
else:X_u.append(1-np.sqrt(3*(1-u))/2)
StandarXaxis=np.linspace(0,1,1000) # 原函数x的概率密度fx,概率密度越大那么逆随机数在此的采样点越多,直方图越高(注意区分概率密度f