在SymPy中使用统计表达式而不指定分布

sta*_*ror 6 python sympy

是否可以在SymPy不指定随机变量分布的情况下操纵统计表达式?

例如,我想使用两个随机变量,X并且Y能够要求SymPy扩展表达式Var(X + Y),得到答案Var(X) + Var(Y) + 2 Cov(X,Y).

我也想能够把上的分布限制XY,例如告诉SymPy说Cov(X, Y) = 0.

这有可能SymPy吗?如果没有,是否有其他包可以做到这一点?

Fra*_*zzi 0

你可以这样做:

\n\n
import itertools\nfrom sympy.stats.rv import RandomSymbol\nfrom sympy.stats import *\n\nclass Variance(Expr):\n\n    def __new__(cls, arg, **kwargs):\n        return Expr.__new__(cls, arg)\n\n    def doit(self, **kwargs):\n        return variance(self.args[0], **kwargs)\n\n    def var_expansion(self):\n        if isinstance(self.args[0], Add):\n            nonrv = []\n            rv = []\n            for a in self.args[0].args:\n                if isinstance(a, RandomSymbol):\n                    rv.append(a)\n            variances = Add(*map(Variance, rv))\n            map_to_covar = lambda x: Function("Covariance")(*x)\n            covariances = Add(*map(map_to_covar, itertools.combinations(rv, 2)))\n            return variances + covariances\n        return self\n
Run Code Online (Sandbox Code Playgroud)\n\n

函数.var_expansion()可以满足您的要求。

\n\n

例子:

\n\n
In [2]: z = Symbol(\'z\')\n\nIn [3]: X = Normal(\'X\', 3, 4)\n\nIn [5]: Y = Normal(\'Y\', 1, 2)\n\nIn [6]: Variance(X)\nOut[6]: Variance(X)\n\nIn [7]: Variance(X + z)\nOut[7]: Variance(z + X)\n\nIn [8]: Variance(X).var_expansion()\nOut[8]: Variance(X)\n\nIn [9]: Variance(X + z).var_expansion()\nOut[9]: Variance(X)\n\nIn [10]: Variance(X + Y).var_expansion()\nOut[10]: Covariance(X, Y) + Variance(X) + Variance(Y)\n
Run Code Online (Sandbox Code Playgroud)\n\n

不幸的是,需要做更多的工作来实现其所有属性。

\n\n

要执行方差的计算:

\n\n
In [14]: Variance(X).doit()\nOut[14]: 16\n
Run Code Online (Sandbox Code Playgroud)\n\n

获取积分表达式:

\n\n
In [18]: Variance(X).doit(evaluate=False)\nOut[18]: \n\xe2\x88\x9e                                                       \n\xe2\x8c\xa0                                                       \n\xe2\x8e\xae                                       2               \n\xe2\x8e\xae        \xe2\x8e\x9b    \xe2\x88\x9e                        \xe2\x8e\x9e                \n\xe2\x8e\xae        \xe2\x8e\x9c    \xe2\x8c\xa0                        \xe2\x8e\x9f                \n\xe2\x8e\xae        \xe2\x8e\x9c    \xe2\x8e\xae                   2    \xe2\x8e\x9f                \n\xe2\x8e\xae        \xe2\x8e\x9c    \xe2\x8e\xae           -(X - 3)     \xe2\x8e\x9f           2    \n\xe2\x8e\xae        \xe2\x8e\x9c    \xe2\x8e\xae           \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80   \xe2\x8e\x9f   -(X - 3)     \n\xe2\x8e\xae        \xe2\x8e\x9c    \xe2\x8e\xae    ___        32       \xe2\x8e\x9f   \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80   \n\xe2\x8e\xae    ___ \xe2\x8e\x9c    \xe2\x8e\xae  \xe2\x95\xb2\xe2\x95\xb1 2 \xe2\x8b\x85X\xe2\x8b\x85\xe2\x84\xaf             \xe2\x8e\x9f       32       \n\xe2\x8e\xae  \xe2\x95\xb2\xe2\x95\xb1 2 \xe2\x8b\x85\xe2\x8e\x9cX - \xe2\x8e\xae  \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 dX\xe2\x8e\x9f \xe2\x8b\x85\xe2\x84\xaf             \n\xe2\x8e\xae        \xe2\x8e\x9c    \xe2\x8e\xae            ___         \xe2\x8e\x9f                \n\xe2\x8e\xae        \xe2\x8e\x9c    \xe2\x8e\xae        8\xe2\x8b\x85\xe2\x95\xb2\xe2\x95\xb1 \xcf\x80          \xe2\x8e\x9f                \n\xe2\x8e\xae        \xe2\x8e\x9c    \xe2\x8c\xa1                        \xe2\x8e\x9f                \n\xe2\x8e\xae        \xe2\x8e\x9d    -\xe2\x88\x9e                       \xe2\x8e\xa0                \n\xe2\x8e\xae  \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 dX\n\xe2\x8e\xae                           ___                         \n\xe2\x8e\xae                       8\xe2\x8b\x85\xe2\x95\xb2\xe2\x95\xb1 \xcf\x80                          \n\xe2\x8c\xa1                                                       \n-\xe2\x88\x9e \n
Run Code Online (Sandbox Code Playgroud)\n