简体   繁体   中英

How to compute a high dimensional multiple integral with infinite bounds using vegas in Julia

I am trying to compute a high dimensional integral using Julia (>1400 dimensions). I am thus trying to do this using the function vegas, as it can presumably compute high dimensional integrals. However, vegas assumes that the domain of integration is [0,1]^n but my integral is over R^n. The documentation of vegas suggests a change of variables, but I cannot get it to work in multiple dimensions.

So, if I type in Julia the following integral in 2 dimensions:

using LinearAlgebra, Cuba
multinormal(x,μ,Σ) = det(2*π*Σ)^(-1/2)*exp(-1/2*(x-μ)'*inv(Σ)*(x-μ))
vegas((x,f)->f=multinormal(x,[0;0],[1 0;0 1]),2)

I get the result

Component:
 1: 0.0 ± 7.025180405943273e-18 (prob.: -999.0)
Integrand evaluations: 1000
Number of subregions:  0
Note: The desired accuracy was reached

which assumes that the integral is over [0,1]^2.

Trying to compute the same integral over [0,infinity)^2, I tried the change of variables suggested here as

vegas((x,f)->f=multinormal(x./(1 .- x),[0;0],[1 0;0 1])./(1 .-x).^2,2)

which gives me the result

Component:
 1: 0.0 ± 7.025180405943273e-18 (prob.: -999.0)
Integrand evaluations: 1000
Number of subregions:  0
Note: The desired accuracy was reached

But the result should be 0.5 rather than 0.

How could I compute this integral of the multivariate normal distribution with infinite integration limits using vegas?

If you use Quadrature.jl it'll perform the necessary changes of variables for you automatically. Then you just use [-Inf,Inf] bounds. See examples in the tests:

https://github.com/SciML/Quadrature.jl/blob/master/test/inf_integral_tests.jl

I ended up just approximating the integral as suggested here: https://stats.stackexchange.com/questions/228687/approximation-expectation-integral

For example, to compute the expected value E of a multivariate normally distributed variable x in two dimensions, I did:

using Distributions, LinearAlgebra
sampleSize = 1000;
dist = MvNormal([0;0],I);
x = rand(dist,sampleSize);
E = 1/sampleSize*sum([x[:,r] for r in 1:sampleSize])

The convenience of this approach is that it works very efficiently for high dimension (in my case the dimension of x is >1400).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM