用sympy随机变量计算简单表达式的方差

时间:2017-09-24 21:07:18

标签: random probability sympy

两个U(0,1)随机变量,X1和X2,我希望方差为max(2,X1)+ X2。

我希望用同情心。是的,我知道这太容易了。但是,我想知道是否有内置的方法来处理像这样的问题,以及如何使用它们。

>>> from sympy.stats import Uniform, Variance
>>> from sympy import symbols, Integral
>>> X1 = Uniform('X1', 0, 1)
>>> X2 = Uniform('X2', 0, 1)

同情似乎不喜欢max;它表达了对if陈述的同样厌恶。

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

不幸的是,我通常很厚。我如何处理涉及条件的概率计算?

1 个答案:

答案 0 :(得分:1)

Python max不能与SymPy对象一起使用;请改用SymPy的Max。此外,您不需要使用被动(未评估)表单Variance,然后请求评估:只需使用variance尝试评估。例如:

from sympy.stats import Uniform, variance, E
from sympy import Max
X1 = Uniform('X1', 0, 1)
X2 = Uniform('X2', 0, 1)
X3 = Max(2, X1) + X2
print(E(X3))
print(variance(X3))

除了积分之外,这类作品似乎太难以被评估,因为它们包含Max。这是输出。

1/2 + Integral(Max(2, X1), (X1, 0, 1))
2*Integral(Max(2, X1), (X1, 0))*Integral(Max(2, X1), (X1, 0, 1)) - 2*Integral(Max(2, X1), (X1, 1))*Integral(Max(2, X1), (X1, 0, 1)) - Integral(Max(2, X1)**2, (X1, 0)) + Integral(Max(2, X1)**2, (X1, 1)) + 1/12 + Integral(Max(2, X1), (X1, 0, 1))**2

强制数字答案适用于预期值:

print(E(X3).evalf())

打印2.5。我发现获得方差的数值的唯一方法是通过抽样 - 也就是说,要求SymPy生成给定大小的样本并从那里获取变化,当然会受到抽样误差的影响。

print(variance(X3, numsamples=1e4))

打印0.0839550029765917。