Matrix 如何使用Symphy创建多元正态密度?

Matrix 如何使用Symphy创建多元正态密度?,matrix,statistics,sympy,Matrix,Statistics,Sympy,我很难用Symphy 0.7.6.1创建多元正态密度 这是我的密码 from sympy import * from sympy.stats import * mu = Matrix([5, 13]) Sigma = Matrix([[2, 0], [0, 2]]) X = Normal('X', mu, Sigma) y = MatrixSymbol('y', 2, 1) density(X)(y) 最后一行给出了以下错误: Power of non-square matrix Matri

我很难用Symphy 0.7.6.1创建多元正态密度

这是我的密码

from sympy import *
from sympy.stats import *

mu = Matrix([5, 13])
Sigma = Matrix([[2, 0], [0, 2]])
X = Normal('X', mu, Sigma)
y = MatrixSymbol('y', 2, 1)
density(X)(y)
最后一行给出了以下错误:

Power of non-square matrix Matrix([
[ -5],
[-13]]) + y

问题很简单:计算密度的公式不是支持矩阵的公式,请看:

在这个表达式中,(x-self.mean)得到平方(即提升到2的幂),但非平方矩阵的平方没有定义

简言之,似乎不支持多元正态分布,但您可以通过定义新分布来尝试解决方法:

from sympy.stats.crv_types import rv, SingleContinuousDistribution, _value_check

class MultivariateNormalDistribution(SingleContinuousDistribution):
        _argnames = ('mean', 'std')
        @staticmethod
        def check(mean, std):
                _value_check(std > 0, "Standard deviation must be positive")
        def pdf(self, x):
                return exp(-S.Half * (x - self.mean).T * (self.std.inv()) * (x - self.mean)) / (sqrt(2*pi)**(self.std.shape[0])*self.std.det())
        def sample(self):
                pass
                # define sampling function here

def MultivariateNormal(name, mean, std):
        return rv(name, MultivariateNormalDistribution, (mean, std))
不幸的是,您的示例仍然不起作用,因为矩阵模块中缺少功能(也就是说,还不支持使用MatrixSymbol对表达式求幂),但是您可以得到点密度:

In[12]: X = MultivariateNormal('X', mu, Sigma)

In [13]: density(X)(Matrix([0, 0]))
Out[13]: 
[ -97/2]
[e     ]
[------]
[ 8*pi ]
或在矩阵中使用符号:

In [14]: x1, x2 = symbols('x1, x2')

In [15]: density(X)(Matrix([x1, x2]))
Out[15]: 
[     2            2             ]
[   x1    5*x1   x2    13*x2   97]
[ - --- + ---- - --- + ----- - --]
[    4     2      4      2     2 ]
[e                               ]
[--------------------------------]
[              8*pi              ]

哇,非常感谢你的回答。这对我帮助很大。