具有未知归一化的区域的 Metropolis Monte Carlo 积分

计算科学 蒙特卡洛 可能性 一体化
2021-12-07 04:35:03

我可能错过了一些非常基本的东西。如果我不知道可访问相空间的体积(即通过分区函数进行适当的归一化),我看不到如何使用 Metropolis–Hastings 算法来计算积分。

考虑这两个问题(它们非常相关):

1) 某些约束下的可能状态数

我有一些可能的区域(概率)和一些不可能的区域(概率)的相空间。我不知道这两个区域的体积,但我可以很容易地检查一个点是否在可能不可能的区域。p(X)=1p(X)=0

因为我知道相空间不可能部分的面积远大于可能部分的面积,所以我不想使用 Metropolis-Hastings 算法来优先探索可能的配置。我可以根据 Metropolis-Hastings 轻松实现更新以生成马尔可夫链,该链确实探索了相空间的可能部分,但是,我不知道如何使用它通过对此类马尔可夫链求和来实际计算可能的区域我仍然不知道正确的标准化。

在 2D http://www.openprocessing.org/sketch/200710中有一个问题的 javascript 可视化, 其中最相关的部分代码是:

// in this example probability of configuration is p=0 
// if the x,y point overlap with some sphere, otherwise it is p=1
float getUnnormalizedProbability( float x, float y ){
  float prob = 1.0;
  for(int i=0; i<nsph; i++){  
    float dx = x - sphx[i];
    float dy = y - sphy[i];
    float r2 = dx*dx + dy*dy;
    if( r2 < sphR2[i] ){
      prob = 0.0;
      break;
    }
  }
  return prob;
}

void MMCstep(){
  float newx = x + random(-stepsz,stepsz);
  float newy = y + random(-stepsz,stepsz);
  // Periodic boundary condition
  if ( newx<0      ) newx = boxsz + newx;
  if ( newx>boxsz  ) newx = newx  - boxsz;
  if ( newy<0      ) newy = boxsz + newy;
  if ( newy>boxsz  ) newy = newy  - boxsz;
  float newp = getUnnormalizedProbability( newx, newy );
  // Metropolis-Hastings condition  alfa =  min( 1, pnew/p );
  if( newp >= p ){
    move( newx, newy, newp );
  }else{
    if( (newp/p) > random(1.0) ){
      move( newx, newy, newp );
    }
  }
}

2)有限板上的中子散射

我有辐射源和探测器(某种尺寸)和几个中子散射材料薄板(某种尺寸和一些归一化的角散射分布)。SD

我想计算发射的影响的中子的百分比。SD

它可以通过随机选择板上然而,这需要通过源自点的中子完全撞击第二块板的概率对总和进行重整化,因为我没有对中子不撞击板的情况进行抽样,我不知道这种重整化。iji

可以看到 plat_2 的立体角)非常费力。我不想那样做。i

我想知道 Metropolis-Hastings 算法是否能以某种方式帮助解决这个问题。

在此处输入图像描述

1个回答

我认为您没有遗漏任何东西,MCMC 用于从给定分布中采样点,已知为归一化常数,并评估对该分布的期望(而不是对体积的积分)。

当分布的归一化常数未知且不需要您知道时,通常会使用它。另一方面,如果您有两个分布,则可以估计它们的归一化常数的比率。由于您可以选择任何 MC,因此您可以选择具有不同平稳分布且具有已知归一化常数的 MC,然后使用它来估计 来计算积分的域上。qEQ[p/q]p(x)dxq

至于您的评论,我可以想到一些可以尝试的方法,但我发现这里很难确定。我认为在某些时候您可能只需要计算中子撞击板 2 的概率。

模拟不撞到板 1 或撞到板 1 但不撞到板 2 的路径应该可以工作:根据板的大小,这可能工作得很好。这应该让您通过分析了解适当的归一化常数。我认为没有太多理由不惜一切代价避免这种情况:一方面,无论您的最终方法是什么,您还可以通过让具有无限大小并让 和板 1 具有点大小并且可能接近来计算这个概率彼此,那么概率主要是板 2 被点板 1 击中的概率。DS

如果您对不位于板 2 上的采样点进行采样,则不必从它所在的所有平面均匀地采样它们:例如,您可以选择一些大约以板 2 顶部为中心的高斯分布。

此外,如果计算立体角确实是阻止您对函数进行归一化的主要因素,那么应该可以用数值方法进行计算。查看 Wikipedia,有一个由具有给定顶点的三角形对向的立体角的公式,因此要从点计算板 2 对向的立体角,您可以将板 2 拆分为合适数量的三角形并总结单个实体每个三角形的角度。这可能是这里最直接的解决方案。i