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

示例中使用的离散随机变量分布的PMF

在这里插入图片描述

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

Generate arbitary discrete distributed random variables given

the probability vector

def discrete_inverse_trans(prob_vec):

U=uniform.rvs(size=1)

if U<=prob_vec[0]:

return 1

else:

for i in range(1,len(prob_vec)+1):

if sum(prob_vec[0:i])<U and sum(prob_vec[0:i+1])>U:

return i+1

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

def discrete_samples(prob_vec,n=1):

sample=[]

for i in range(0,n):

sample.append(discrete_inverse_trans(prob_vec))

return np.array(sample)

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

‘’’

遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

‘’’

def discrete_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/n

ax.bar(numbers,prob)

ax.set_title(“Simulation of Generating %i Discrete Random Variables” %n)

plt.show()

data={‘X’:unique,‘Number of samples’:counts,‘Empirical Probability’:prob,‘Actual Probability’:prob_vec}

df=pd.DataFrame(data=data)

return df

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

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=discrete_simulate(prob_vec, numbers, n=500)

dis_example3=discrete_simulate(prob_vec, numbers, n=1000)

生成与实际的100个离散随机变量

在这里插入图片描述生成的vs实际的500个离散随机变量

在这里插入图片描述生成的与实际的1000个离散随机变量

在这里插入图片描述

In[11]: dis_example1

Out[11]:

X Number of samples Empirical Probability Actual Probability

0 1 8 0.08 0.10

1 2 35 0.35 0.30

2 3 50 0.50 0.50

3 4 5 0.05 0.05

4 5 2 0.02 0.05

In[12]: dis_example2

Out[12]:

X Number of samples Empirical Probability Actual Probability

0 1 53 0.106 0.10

1 2 159 0.318 0.30

2 3 234 0.468 0.50

3 4 30 0.060 0.05

4 5 24 0.048 0.05

In[13]: dis_example3

Out[13]:

X Number of samples Empirical Probability Actual Probability

0 1 108 0.108 0.10

1 2 290 0.290 0.30

2 3 491 0.491 0.50

3 4 51 0.051 0.05

4 5 60 0.060 0.05

结果很有趣!我们可以看到,随着我们增加随机变量样本的数量,经验概率越来越接近实际概率。尝试使用不同数量的样本和/或不同的分布进行实验,以查看不同的结果。
总结
这种逆变换方法是统计中非常重要的工具,尤其是在仿真理论中,在给定随机变量均匀分布在(0,1)中的情况下,我们想生成随机变量。研究案例本身非常广泛,您可以使用在生成经验累积分布函数,预测分析中使用到的这种方法。

文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值