我正在蒙特卡罗的重要抽样工作。提供了以下代码:
clear dim=2;power=3;const1=?;const2=?;N=10^5;
X=(rand(dim,N).^power);
%creates a random sample of N vectors of dimension 2
%the coordinates of these vectors are not uniformly
%random: they have P(coordinate<a)=a^(1/3)
Density=prod(const1*X.^(const2));
Sample=(sum(X.^2)<1);
%count the number of vectors < 1
ISSample=Sample./Density*4;
aM=mean(ISSample);
bM=std(ISSample);
[aM-1.96*bM/sqrt(N),aM+1.96*bM/sqrt(N)]
问题是双重的:
如何查找常量,以及如何使其在更高维度上工作。 我一直在研究这个问题,但我似乎无法控制重要性抽样。我预计当样本以第三个幂产生时,常数2也将在第三个幂中,但是这给出了具有虚数的置信区间。任何有关我应该采取的方向的帮助将不胜感激!
此致 杰夫
答案 0 :(得分:0)
好的,我现在不会写任何代码,我的Matlab太生锈了。但这是一般的想法。
您的采样在单位磁盘上是均匀的,并采用拒绝方法完成。实际上,它可能分为两个问题。一个是单位圆上的点的采样。其次,是根据某些幂律对半径进行采样。
让我们从半径采样开始。很容易看出,由于雅可比二维情况下径向分布与r*dr
成正比,可以采样为
r = sqrt(U(0,1)); % or
r = pow(U(0,1), 1/2);
如果由雅可比PDF导致的3D与r^2*dr
成比例,可以采样为
r = pow(U(0,1), 1/3);
一般来说,nD情况有一个明显的结论,即半径可以采样为
r = pow(U(0,1), 1/n);
好的,现在我们应该在3D情况下选择单位球面上的点,或者在更高尺寸的情况下在单位超球面上选择点,将其乘以半径并在球体/超球面内均匀获得点
为了对球体上的点进行采样,我建议从
中选择Marsaglia方法http://mathworld.wolfram.com/SpherePointPicking.html
为了对超球面上的点进行采样,我建议从
中选择类似的方法