我使用 scipy.stats 有一些随机变量,如下所示:
import scipy.stats as st
x1 = st.uniform()
x2 = st.uniform()
现在我想根据以前的随机变量创建另一个随机变量,并对新的随机变量进行一些计算,例如 var
。假设我希望新的随机变量类似于 max(2, x1) + x2。我如何动态定义它?
最佳答案
我的旧答案如下:
(当编辑引用 SO 文档的答案以删除这些引用时,系统提示我再次查看这个问题。无论如何,我认为这是一个更好的答案。)
首先,据我所知,没有通用的方法可以为两个或多个变量的非线性函数的方差获得一个很好的封闭式表达式。可能大多数人都会采用某种蒙特卡罗策略来近似这样的数量。
这里有一些代码可以生成针对这种特定情况执行此操作的绘图。它适用于许多其他内容。
从单位均匀随机变量生成两个伪随机样本,然后计算伪随机随机变量 Y
作为这些样本元素的函数。
>>> import scipy.stats as stats
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> X1 = stats.uniform.rvs(0,1, 5000)
>>> X2 = stats.uniform.rvs(0,1, 5000)
>>> Y = [max(2,x1)+x2 for (x1,x2) in zip(X1,X2)]
现在,为了确定该函数的密度函数,绘制其直方图。
>>> plt.hist(Y)
(array([ 501., 526., 490., 481., 513., 488., 525., 490., 521., 465.]), array([ 2.00012599, 2.10007992, 2.20003386, 2.2999878 , 2.39994173,
2.49989567, 2.59984961, 2.69980354, 2.79975748, 2.89971141,
2.99966535]), <a list of 10 Patch objects>)
>>> plt.show()
我们很幸运,因为它很容易识别。在这里。
这是一个统一的,其支持是闭区间[2,3]。我们可以再次使用 scipy,这次来获取它的方差。其他时刻可用;请参阅文档。
>>> stats.uniform.stats(2,1, moments='v')
array(0.08333333333333333)
这一切其实都没有必要,不是吗?
作为 U(0,1) 随机变量,X1 永远不会超过 1。因此,max(X1, 2) 必须为 2。然后 2+X2 必须为 U(2,3)。该随机变量与 X2 具有相同的尺度;只是它的位置发生了变化。因此其方差一定相同,U(0,1) 的方差为 0.0833333。
编辑“下一天”:
刚刚(从 https://stackoverflow.com/a/46383333/131187 )了解到 sympy 现在支持随机变量,我很想尝试解决这个问题。
>>> from sympy.stats import Uniform, Variance
>>> from sympy import symbols, Integral
>>> X1 = Uniform('X1', 0, 1)
>>> X2 = Uniform('X2', 0, 1)
唉,正如其他答案的作者指出的那样,它似乎无法处理涉及 max
的表达式。
>>> Variance(max(2, X1) + X2)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "C:\Python34\lib\site-packages\sympy-1.0.1.dev0-py3.4.egg\sympy\core\relational.py", line 195, in __nonzero__
raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational
但对于这个问题来说,这并不是必需的。它很容易被消除。我们有,它产生方差积分的精确值。
>>> Variance(2 + X2)
Variance(X2 + 2)
>>> Variance(2 + X2).evaluate_integral()
1/12
“旧答案”从这里开始:
我认为不是直接的。不过,这种方法可能对您有用。
首先假设您知道感兴趣的随机变量函数的 pdf 或 cdf。然后您可以使用 scipy.stats 中的 rv_continuous 来计算该函数的方差和其他矩。
显然,“乐趣”从这里开始。通常您会尝试定义 cdf。对于随机变量的任何给定值,这是诸如您给出的表达式之类的表达式不大于给定值的概率。因此,确定 cdf 就简化为求解两个变量的(无限)不等式集合。当然,通常有一个强大的模式可以大大降低执行此任务的复杂性和难度。
关于python - 在python中动态构建随机变量的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40070390/