双变量正态的条件抽样

机器算法验证 可能性 正态分布 条件概率 蒙特卡洛
2022-04-01 02:06:54

我想在一个条件下从二元正态分布生成随机样本。第一个正常变量是,第二个条件是,其中是一个常数,而,其中是常数。是独立的。因此,条件是在以垂直线ε1ε2ε1>T1T1aε1+bε2<T2abT1ε1ε2T1和一条倾斜的线。有没有办法做到这一点而不产生许多随机样本并将这些样本扔到条件区域之外?原因是条件区域中的概率可能非常小,因此丢弃样本不是一种选择。

3个回答

如果您有另一个界限(例如),您可以均匀采样,然后使用二元正态密度对样本进行加权。你会有零拒绝。也许在您的应用程序中强加这样的限制不是太不合理?ϵ2>T3

可能更好:

您会找到两个线性条件之间的交集。然后,您从指数或截断法线沿两个条件之一(例如沿生成 rv然后,如果两个线性条件之间的角度是锐角,则如果它是钝的,则从截断的法线或指数不涉及拒绝,并且您不需要限制区域,但您会获得加权样本。x1ϵ1=T1ϵ1=T1x1aϵ1+bϵ2=T2ϵ1=T1

我使用了吉布斯抽样方法。这样,只有吉布斯采样的开始被丢弃(稳定期)。因此,腰部样本的数量不会随着所需样本的数量而增加。

  • 在观察的条件下,是从正态分布中采样的,有界ε1ε2bε2<Th2aε1
  • 以观察为条件,ε2Th1<ε1<(Th2bε2)/a

下面的代码设置a=t1b=t2t1

    nScens = 1E8;
    epsilon1 = randn(nScens, 1);
    epsilon2 = randn(nScens, 1);
    Th1 = -3;
    Th2 = -2.9;
    t1 = 700;
    t2 = 707;

    ind = epsilon1 > Th1 & ( epsilon1*sqrt(t1) + epsilon2*sqrt(t2-t1))/sqrt(t2) < Th2;
    sum(ind)

    figure(1)
    subplot(121)
    scatter(epsilon1(ind), epsilon2(ind),'.' )
    axis([ -3 -2.5 -5 1])
    subplot(122)        
    smoothhist2D([epsilon1(ind), epsilon2(ind)],5, [100,100],[], 'contour')
    axis([ -3 -2.5 -5 1])

    %      gibbs sampler
    nGibbs = 75000;
    epsilon1Gibbs = 0;
    for i=1:nGibbs
        epsilon2Gibbs = norminv( normcdf( (Th2*sqrt(t2) - epsilon1Gibbs*sqrt(t1) )/sqrt(t2-t1) )*rand );
        p = ( -normcdf(Th1) + normcdf( (Th2*sqrt(t2) - epsilon2Gibbs*sqrt(t2-t1) )/sqrt(t1) ) )*rand + normcdf(Th1);
        epsilon1Gibbs = norminv( p );
        epsilonGibbs(i, :) = [epsilon1Gibbs epsilon2Gibbs];
    end
    indGibbs = 2500:nGibbs;
    figure(2)
    subplot(121)
    scatter(epsilonGibbs(indGibbs,1), epsilonGibbs(indGibbs,2),'.'  )
    axis([ -3 -2.5 -5 1])
    subplot(122)        
    smoothhist2D( epsilonGibbs(indGibbs,:) ,5, [100,100],[], 'contour')
    axis([ -3 -2.5 -5 1])

蛮力采样: 蛮力采样

吉布斯抽样: 吉布斯抽样

一种会大幅降低拒绝率的简单方法是将坐标旋转到使得线变为垂直 ( ,说)。然后从截断的法线生成然后生成一个独立的并拒绝那些不符合其他(旋转)条件的对,并将接受的对旋转回来。(ϵ1,ϵ2)(X1,X2)aε1+bε2=T2cX1=τ2cX1<τ2X2

拒绝率会很高(例如,它可能会超过 50%),但可能根本不会是极端的,因为如果你一开始没有从极尾截断法线生成,那肯定会如此。