Skip to main content
added 11 characters in body
Source Link
Mark L. Stone
  • 13.5k
  • 1
  • 38
  • 58

I have written this assuming that you don't want any points having ||y|| > a, which is the analogue of the usual one dimensional truncation. However, you have written that you want to keep points having |y|| >= a and throw out the others. Nevertheless, the obvious adjustment to my solution can be made if you really do want to keep points having |y|| >= a.

The most straightforward way, which ishappens to be a very general technique, is to use Acceptance-Rejection https://en.wikipedia.org/wiki/Rejection_sampling . It will be fairly fast as long as Prob(||X|| > a) is fairly low, because then there will not be many rejections.

Generate a sample value x from the unconstrained Multivariate Normal (even though your problem states that the Multivariate Normal is spherical, the techniquestechnique can be applied even if it's not). If ||x|| <= a, accept, i.e., use x, otherwise reject it and generate a new sample. Repeat this process until you have as many accepted samples as you need. The effect of applying this procedure is to generate y such that its density is c * f_X(y), if ||y|| <= a, and 0 if ||y|| > a, per my correction to the opening portion of your question. You never need to compute c; it is in effect auto-determined by the algorithm based on the frequency with which samples are rejected.

I have written this assuming that you don't want any points having ||y|| > a, which is the analogue of the usual one dimensional truncation. However, you have written that you want to keep points having |y|| >= a and throw out the others. Nevertheless, the obvious adjustment to my solution can be made if you really do want to keep points having |y|| >= a.

The most straightforward way, which is a very general technique, is to use Acceptance-Rejection https://en.wikipedia.org/wiki/Rejection_sampling . It will be fairly fast as long as Prob(||X|| > a) is fairly low, because then there will not be many rejections.

Generate a sample value x from the unconstrained Multivariate Normal (even though your problem states that the Multivariate Normal is spherical, the techniques can be applied even if it's not). If ||x|| <= a, accept, i.e., use x, otherwise reject it and generate a new sample. Repeat this process until you have as many accepted samples as you need. The effect of applying this procedure is to generate y such that its density is c * f_X(y), if ||y|| <= a, and 0 if ||y|| > a, per my correction to the opening portion of your question. You never need to compute c; it is in effect auto-determined by the algorithm based on the frequency with which samples are rejected.

I have written this assuming that you don't want any points having ||y|| > a, which is the analogue of the usual one dimensional truncation. However, you have written that you want to keep points having |y|| >= a and throw out the others. Nevertheless, the obvious adjustment to my solution can be made if you really do want to keep points having |y|| >= a.

The most straightforward way, which happens to be a very general technique, is to use Acceptance-Rejection https://en.wikipedia.org/wiki/Rejection_sampling . It will be fairly fast as long as Prob(||X|| > a) is fairly low, because then there will not be many rejections.

Generate a sample value x from the unconstrained Multivariate Normal (even though your problem states that the Multivariate Normal is spherical, the technique can be applied even if it's not). If ||x|| <= a, accept, i.e., use x, otherwise reject it and generate a new sample. Repeat this process until you have as many accepted samples as you need. The effect of applying this procedure is to generate y such that its density is c * f_X(y), if ||y|| <= a, and 0 if ||y|| > a, per my correction to the opening portion of your question. You never need to compute c; it is in effect auto-determined by the algorithm based on the frequency with which samples are rejected.

added 513 characters in body
Source Link
Mark L. Stone
  • 13.5k
  • 1
  • 38
  • 58

I have written this assuming that you don't want any points having ||y|| > a, which is the analogue of the usual one dimensional truncation. However, you have written that you want to keep points having |y|| >= a and throw out the others. Nevertheless, the obvious adjustment to my solution can be made if you really do want to keep points having |y|| >= a.

The most straightforward way, which is a very general technique, is to use Acceptance-Rejection https://en.wikipedia.org/wiki/Rejection_sampling . It will be fairly fast as long as Prob(||X|| >=> a) is fairly highlow, because then there will not be many rejections.

Generate a sample value x from the unconstrained Multivariate Normal (even though your problem states that the Multivariate Normal is spherical, the techniques can be applied even if it's not). If ||x|| >=<= a, accept, i.e., use x, otherwise reject it and generate a new sample. Repeat this process until you have as many accepted samples as you need. The effect of applying this procedure is to generate y such that its density is c * f_X(y), if ||y||≥||y|| <= a, and 0 if ||y|| > a, per my correction to the opening portion of your question. You never need to compute c; it is in effect auto-determined by the algorithm based on the frequency with which samples are rejected.

The most straightforward way, which is a very general technique, is to use Acceptance-Rejection https://en.wikipedia.org/wiki/Rejection_sampling . It will be fairly fast as long as Prob(||X|| >= a) is fairly high, because then there will not be many rejections.

Generate a sample value x from the unconstrained Multivariate Normal (even though your problem states that the Multivariate Normal is spherical, the techniques can be applied even if it's not). If ||x|| >= a, accept, i.e., use x, otherwise reject it and generate a new sample. Repeat this process until you have as many samples as you need. The effect of applying this procedure is to generate y such that its density is c * f_X(y), if ||y||≥ a, per the opening portion of your question.

I have written this assuming that you don't want any points having ||y|| > a, which is the analogue of the usual one dimensional truncation. However, you have written that you want to keep points having |y|| >= a and throw out the others. Nevertheless, the obvious adjustment to my solution can be made if you really do want to keep points having |y|| >= a.

The most straightforward way, which is a very general technique, is to use Acceptance-Rejection https://en.wikipedia.org/wiki/Rejection_sampling . It will be fairly fast as long as Prob(||X|| > a) is fairly low, because then there will not be many rejections.

Generate a sample value x from the unconstrained Multivariate Normal (even though your problem states that the Multivariate Normal is spherical, the techniques can be applied even if it's not). If ||x|| <= a, accept, i.e., use x, otherwise reject it and generate a new sample. Repeat this process until you have as many accepted samples as you need. The effect of applying this procedure is to generate y such that its density is c * f_X(y), if ||y|| <= a, and 0 if ||y|| > a, per my correction to the opening portion of your question. You never need to compute c; it is in effect auto-determined by the algorithm based on the frequency with which samples are rejected.

Source Link
Mark L. Stone
  • 13.5k
  • 1
  • 38
  • 58

The most straightforward way, which is a very general technique, is to use Acceptance-Rejection https://en.wikipedia.org/wiki/Rejection_sampling . It will be fairly fast as long as Prob(||X|| >= a) is fairly high, because then there will not be many rejections.

Generate a sample value x from the unconstrained Multivariate Normal (even though your problem states that the Multivariate Normal is spherical, the techniques can be applied even if it's not). If ||x|| >= a, accept, i.e., use x, otherwise reject it and generate a new sample. Repeat this process until you have as many samples as you need. The effect of applying this procedure is to generate y such that its density is c * f_X(y), if ||y||≥ a, per the opening portion of your question.