当前位置: 首页 > 科技观察

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

时间:2023-03-15 23:47:01 科技观察

goal在仿真理论中,生成随机变量是最重要的“积木”之一,而这些随机变量大多是由均匀分布的随机变量生成的。可用于生成随机变量的方法之一是逆变换方法。在本文中,我将向您展示如何使用Python中的逆变换方法生成随机变量(离散和连续情况)。概念给定一个随机变量U,其中U均匀分布在(0,1)中。假设我们要生成一个随机变量X,其中累积分布函数(CDF)为:逆变换方法的思想是利用其逆CDF从任意概率分布中生成一个随机数,如下所示。对于离散随机变量,程序略有不同。假设我们要生成离散随机变量X的值,它具有概率质量函数(PMF)。为了生成X的值,我们需要生成一个随机变量U,它均匀分布在(0,1)中,通过上述步骤定义,我们可以创建逆变换方法的算法如下。连续随机数代码实现首先,我们实现这个方法来生成连续随机变量。假设我们要模拟一个随机变量X,它遵循均值为λ的指数分布(即X~EXP(λ))。我们知道指数分布的概率分布函数(PDF)就是如下的CDF。然后,我们可以使用以下方法编写逆CDF。在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="Generater.v.")plt.hist(actual,bins=50,alpha=0.5,label="Actualr.v.")plt.title("GeneratedvsActual%iExponentialRandomVariables"%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)看起来很有趣。如果我们将其与真实变量进行比较,我们可以看到生成的随机变量具有非常相似的结果。均值(请注意,我为expon.rvs()函数定义的均值是指数分布中的尺度参数)和/或生成的随机变量的数量可以调整以查看不同的结果。离散随机数实现代码对于离散随机变量情况,假设我们要模拟服从以下分布的离散随机变量情况X。首先,我们编写函数以使用这些代码行为一个样本生成离散随机变量。###Generatearbitarydiscreteddistributedrandomvariablesgiven###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])U:returni+1然后我们创建一个函数来使用这些代码行生成许多随机变量样本。defdiscrete_samples(prob_vec,n=1):sample=[]foriinrange(0,n):sample.append(discrete_inverse_trans(prob_vec))returnnp.array(sample)最后,我们创建一个函数来模拟结果并传递这些行code与实际结果进行比较。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("SimulationofGenerating%iDiscreteRandomVariables"%n)plt.show()data={'X':unique,'Numberofsamples':counts,'EmpiricalProbability':prob,'ActualProbability':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=iNCETE_SIMAUTION(prob_vec,number,n=500)dis_example3=iNCETE_SIMAUTIONS(prib_vec,numbers,n=1000)[11]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)中。研究案例本身非常广泛,您可以使用您用于生成经验累积分布函数、预测分析的方法。