scipy 如何对下面的表达式进行数值积分?

2admgd59  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(55)

我正在尝试用Python计算以下表达式
x1c 0d1x的数据
表达式来自t分布,v是表示自由度的标量,mu和sigma分别是向量和矩阵,定义均值和标准差。我如何继续获得表达式的数值积分?我已经尝试使用PyTorch和Scipy quad函数进行以下操作:

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]

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

7hiiyaii

7hiiyaii1#

有点晚了,但这个问题似乎没有解决。
粗体z(z)通常用于矢量表示法,在这种情况下它是正确的,因为积分的左部分是multivariate t-distributionkernel
在你的例子中,似乎有问题的是你计算向量乘法的方式。
首先,如果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如何处理这个,除非你integrate on a path。你可以考虑替代品,如scipy.nquad,等等。

相关问题