是否可以在SymPy不指定随机变量分布的情况下操纵统计表达式?
例如,我想使用两个随机变量,X并且Y能够要求SymPy扩展表达式Var(X + Y),得到答案Var(X) + Var(Y) + 2 Cov(X,Y).
我也想能够把上的分布限制X和Y,例如告诉SymPy说Cov(X, Y) = 0.
这有可能SymPy吗?如果没有,是否有其他包可以做到这一点?
你可以这样做:
\n\nimport 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\nRun Code Online (Sandbox Code Playgroud)\n\n函数.var_expansion()可以满足您的要求。
\n\n例子:
\n\nIn [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)\nRun Code Online (Sandbox Code Playgroud)\n\n不幸的是,需要做更多的工作来实现其所有属性。
\n\n要执行方差的计算:
\n\nIn [14]: Variance(X).doit()\nOut[14]: 16\nRun Code Online (Sandbox Code Playgroud)\n\n获取积分表达式:
\n\nIn [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 \nRun Code Online (Sandbox Code Playgroud)\n