两个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
不幸的是,我通常很厚。我如何处理涉及条件的概率计算?
答案 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。