概率计算。构建和评估涉及随机变量的数学表达式。
项目描述
rvmath: 随机变量数学,简单易用
rvmath 是一个Python包,用于构建和评估涉及随机变量的数学表达式。
你想从由 a * cos(b + c) 得到的分布中抽取10个值,其中 a ~ Poisson,b ~ Uniform,c ~ Normal 吗?没问题
>>> import rvmath as rvm
>>> z = rvm.poisson(mu=5) * np.cos(rvm.uniform() + rvm.norm())
>>> z.rvs(10)
它运行在Python 3.7+上,依赖于 NumPy 和 SciPy。它采用BSD许可证。
它非常简单易用
>>> import rvmath as rvm
>>> x = rvm.uniform()
>>> y = rvm.uniform()
>>> z = x - y
>>> z.rvs(3) #doctest: +SKIP
[ 0.56791289 -0.1547692 -0.73984907]
>>> z.rvs(3) #doctest: +SKIP
[-0.33095289 -0.08664128 0.09938225]
简而言之,x 和 y 是从均匀分布中抽取的随机变量。 z 是从两个均匀分布的差得到的分布中抽取的随机变量。 z.rvs(3) 从该分布中抽取3个值。
在幕后,rvmath 生成所有随机变量的随机变量并执行所有必要的计算。
rvmath 基于 Scipy Stats,因此那里可用的所有连续分布也在这里,具有相同的名称和参数。 rvs 也遵循相同的API,即
size:int 或 int 元组,可选,定义随机变量的数量(默认为 1)。
random_state:None、int、RandomState、Generator,可选。如果 seed 为 None,则使用 RandomState 单例。如果 seed 是一个 int,则使用带有 seed 的新 RandomState 实例。如果 seed 已经是 RandomState 或 Generator 实例,则使用该对象。默认为 None。
一个重要的特性是随机变量有一个身份,因此以下代码可以得到预期结果。
>>> w = x - x
>>> w.rvs(3)
[0., 0., 0.]
您还可以使用 NumPy 函数。
>>> c = np.cos(x)
>>> c.rvs(3)
最后,您可以将表达式转换为 SciPy 分布
>>> distro = c.to_distro(name="my_distro")
以获得具有如 rvs、pdf、cdf 等有用方法的对象。
快速安装
要安装 rvmath,只需(很快)
$ pip install rvmath
然后您就可以简单地享受它了!
其他功能
所有 rvmath 对象都有一些有用的选项和方法
您可以为随机变量分配一个 ID
>>> x = rvm.uniform(rvid="x")
以简化调试。如果 rvid 未给出,则将生成一个随机字符串。
您可以请求包含所有随机变量名称及其底层 SciPy 分布对象的字典。
>>> x = rvm.uniform(rvid="x")
>>> y = rvm.norm(rvid="y")
>>> z = x + y
>>> dict(z.random_vars())
{'x': <scipy.stats._distn_infrastructure.rv_frozen at 0x7ff57f196220>,
'y': <scipy.stats._distn_infrastructure.rv_frozen at 0x7ff57e5a81f0>}
您可以从对象内的所有随机变量中抽取值。
>>> realization = z.draw(3)
>>> print(realization)
{'x': array([0.75633395, 0.99657116, 0.26853511]),
'y': array([-1.23407414, 0.5261816 , 2.62764828])}
最后,您可以评估对象以获得特定的实现。
>>> z.eval(realization)
array([-0.47774019, 1.52275276, 2.89618339])
这正是调用 rvs 时发生的情况,但对于调试、测试和评估子表达式特别有用。
在某些情况下,您可能想要预先定义某些随机变量的大小。您可以在构造时使用 size 参数来完成此操作。
>>> z = np.sum(rvm.uniform(size=(3, 3))) * rvm.norm()
没有明确大小参数的随机变量将评估为调用 rvs 时给出的大小。
结合此功能,您可以构建依赖于其他分布的分布
>>> m = rvm.uniform(size=1)
>>> w = rvm.norm(loc=m)
您可以将定义的分布大小与 rvs 提供的大小组合
>>> m = rvm.uniform(size=(None, 3, None)).rvs(2)
>>> m.shape
(2, 3, 2)
None 值将被替换为提供给 rvs 的标量。
常见问题解答
rvmath 支持哪些分布?
Scipy 中所有可用的连续分布,您可以在 SciPy Stats 文档中查看列表。
您计划支持离散分布吗?
是的,希望在下一个版本中。
我已经通过继承 ``rv_continuous`` 创建了自己的分布子类,我可以与 rvmath 一起使用它吗?
是的,只需调用 rvm.wrap(distro, *args, **kwargs)
rvmath 由社区维护。有关完整的作者名单,请参阅 AUTHORS。
要查看每个版本项目的有序更改列表,请参阅 CHANGES
项目详细信息
下载文件
下载适合您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。