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])
