我如何对以下表达式进行数值积分?

问题描述 投票:0回答:1

我目前正在尝试在 Python 中计算以下表达式

该表达式来自 t 分布,v 是表示自由度的标量,mu 和 sigma 分别是向量和矩阵,定义平均值和标准差。我将如何继续获得表达式的数值积分?我已经使用 PyTorch 和 Scipy 四元函数尝试了以下操作:

def integrand(x, mu, std,v,p):
    return torch.sum((1+(x-mu)**2*std**(-2)/v)**((-v+p)/2)*torch.log(1+x**2/v))

integrate.quad(integrand, -np.inf,np.inf, args=(mu,std,v,p))[0]

然而,结果却相当令人失望。让我烦恼的是向量,我认为我不知道如何处理这种情况,也没有指定限制。非常感谢您的帮助,非常感谢!如果需要更多信息,请告诉我。

python scipy pytorch numerical-methods numerical-integration
1个回答
0
投票

有点晚了,但这个问题似乎还没有解决。

粗体 z (z) 通常用于矢量表示法,在这种情况下它会被检查出来,因为积分中的左侧部分是 多元 t 分布kernel

在您的情况下似乎有问题的是计算向量乘法的方式。

首先,如果

x
是一个列表/数组,
(x-mu)**2
甚至不会计算,所以我假设 x 是一个 Numpy 数组。因此,使用带有幂运算符的
numpy
数组可以计算逐元素幂:

> np.array([1,2,3])**2
array([1, 4, 9])

但是,您尝试评估的多元密度核是一个标量函数(因为它输出一个标量)。这意味着默认情况下您的矢量符号以列为单位,并且 zTz 是标量。因此,您必须对向量平方求和:

sum((x-mu)**2)

目前让我烦恼的是,如果你使用多元 t 分布,那么你就有一个多元积分,而且我不太知道

scipy.integrate
如何处理这个问题,除非你在路径上积分。您可以考虑其他替代方案,例如
scipy.nquad

© www.soinside.com 2019 - 2024. All rights reserved.