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

Calculating variance of a simple expression with sympy random variables

两个U(0,1)随机变量,X1和X2,我想要max(2,X1)+X2的方差。

而且我希望使用 sympy。是的,我知道这太容易了。但是,我想知道是否有内置的方法来处理此类问题,以及如何使用它们。

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

sympy 似乎不喜欢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

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

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。