python – 从任意概率密度函数生成随机数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 从任意概率密度函数生成随机数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2023字,纯文字阅读大概需要3分钟。
内容图文
![python – 从任意概率密度函数生成随机数](/upload/InfoBanner/zyjiaocheng/811/81fa102265a640a580deb4693b1f9f5a.jpg)
我希望能够生成具有来自绘制曲线的概率密度函数的随机数.下面这两个在曲线下面积相同,但应该产生具有不同特征的随机数列表.
我的直觉是,一种方法是对曲线进行采样,然后使用这些矩形的区域来提供一个np.random.choice来选择一个范围来在该矩形范围的范围内进行普通随机.
这不是一种非常有效的方法.有没有更“正确”的方法呢?
我真的很喜欢这样做:
import matplotlib.pyplot as plt
import numpy as np
areas = [4.397498, 4.417111, 4.538467, 4.735034, 4.990129, 5.292455, 5.633938,
6.008574, 6.41175, 5.888393, 2.861898, 2.347887, 2.459234, 2.494357,
2.502986, 2.511614, 2.520243, 2.528872, 2.537501, 2.546129, 7.223747,
7.223747, 2.448148, 1.978746, 1.750221, 1.659351, 1.669999]
divisons = [0.0, 0.037037, 0.074074, 0.111111, 0.148148, 0.185185, 0.222222,
0.259259, 0.296296, 0.333333, 0.37037, 0.407407, 0.444444, 0.481481,
0.518519, 0.555556, 0.592593, 0.62963, 0.666667, 0.703704, 0.740741,
0.777778, 0.814815, 0.851852, 0.888889, 0.925926, 0.962963, 1.0]
weights = [a/sum(areas) for a in areas]
indexes = np.random.choice(range(len(areas)), 50000, p=weights)
samples = []
for i in indexes:
samples.append(np.random.uniform(divisons[i], divisons[i+1]))
binwidth = 0.02
binSize = np.arange(min(samples), max(samples) + binwidth, binwidth)
plt.hist(samples, bins=binSize)
plt.xlim(xmax=1)
plt.show()
该方法似乎有效,但有点重!
解决方法:
对于您的情况,似乎基于直方图的方法肯定是最简单的,因为您有一条用户绘制的线.
但是,由于您只是尝试从该分布生成随机数,您可以使用标准化的y值(将所有像素的y位置相加除以总计)作为probability_distribution直接在下面的函数中使用数组用户绘制的像素数的大小.
from numpy.random import choice
pde = choice(list_of_candidates, number_of_items_to_pick, p=probability_distribution)
probability_distribution(标准化像素y值)是与list_of_candidates(相关联的x值)的顺序相同的序列.您还可以使用关键字replace = False来更改行为,以便不替换绘制的项目.
这应该快得多,因为你实际上并没有生成一个完整的pde,只是绘制与pde匹配的随机数.
编辑:您的更新看起来像一个坚实的方法.如果你想生成pde,你可以考虑调查numba(http://numba.pydata.org)来矢量化你的for循环.
内容总结
以上是互联网集市为您收集整理的python – 从任意概率密度函数生成随机数全部内容,希望文章能够帮你解决python – 从任意概率密度函数生成随机数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。