Questions tagged «monte-carlo»

关于蒙特卡洛方法的问题,这些方法需要重复生成(伪,准)随机数来计算其结果。

4
如何可靠地添加大指数项而不会出现溢出错误?
蒙特卡洛马尔可夫链中一个非常普遍的问题涉及计算概率,这些概率是大指数项的和, ea1+ea2+...ea1+ea2+... e^{a_1} + e^{a_2} + ... 其中的各组分可以从非常小的范围内,以非常大的。我的方法是排除最大指数项以便:aaaK:=maxi(ai)K:=maxi(ai)K := \max_{i}(a_{i}) a′=K+log(ea1−K+ea2−K+...)a′=K+log(ea1−K+ea2−K+...)a' =K + log\left( e^{a_1 - K} + e^{a_2 - K } + ... \right) ea′≡ea1+ea2+...ea′≡ea1+ea2+...e^{a'} \equiv e^{a_1} + e^{a_2} + ... 这种做法是合理的,如果所有的元素aaa,如果他们不是很大,但不是一个好主意。当然,较小的元素无论如何都不会对浮点数求和,但是我不确定如何可靠地处理它们。在R代码中,我的方法如下所示: if ( max(abs(a)) > max(a) ) K <- min(a) else K <- max(a) ans <- log(sum(exp(a-K))) + …

3
多维度的PDE
我知道,找到PDE近似解的大多数方法都无法随维数扩展,并且Monte Carlo用于需要约100维的情况。 有什么好的方法可以有效地对〜4-10维的PDE进行数值求解?10-100? 除了蒙特卡洛,还有没有其他方法可以随维数扩展?

5
我如何近似不正确的积分?
我有一个函数使得∫ [R 3 ˚F (X ,ÿ ,Ž )d V 是有限的,我想接近这个积分。 F(x ,y,ž)f(x,y,z)f(x,y,z) ∫[R3F(x ,y,ž)dV∫R3f(x,y,z)dV\int_{R^3} f(x,y,z)dV 我对积分的正交规则和蒙特卡洛近似法很熟悉,但是在无限域中实现它们存在一些困难。在蒙特卡洛的情况下,如何去采样一个无限的区域(尤其是如果对积分有更大贡献的区域是未知的)?在正交情况下,如何找到最佳点?我是否应该简单地固定以原点为中心的任意大区域并应用稀疏正交规则?我怎样才能近似这个积分?

2
关于自动区分,源代码转换(STC)是否比运算符重载(OO)更有效?
我们正在研究一个时空过程的贝叶斯模型,并且正在使用一个No-U-Turn采样器(NUTS),该采样器需要一个对数概率模型以及相对于模型参数的梯度。更简洁地说,我们有相当复杂的对数概率函数,涉及统计分布,克罗内克乘积,指数,比率,if-else语句等,需要提供它以及它对NUTS的梯度。几个软件包(Stan和 Julia的MCMC)使用运算符重载(据我所知)自动获取渐变。f:Rn→Rf:Rn→Rf : \mathbb{R}^n \rightarrow \mathbb{R} 如果我们能够使用源代码转换自动差异工具来创建自己的梯度函数,那么我们是否会获得更好的性能,或者OO一样好还是更好?

4
异步蜂窝自动机的并行(GPU)算法
我有一组计算模型,这些模型可以描述为异步蜂窝自动机。这些模型类似于Ising模型,但稍微复杂一些。这样的模型似乎可以从在GPU而非CPU上运行中受益。不幸的是,并行化这样一个模型不是很简单,而且我也不清楚如何去实现它。我知道有关于该主题的文献,但似乎所有这些文献都是针对对算法复杂性细节感兴趣的铁杆计算机科学家,而不是像我这样只想要描述我可以实现的东西的人,以及因此,我觉得它是不可渗透的。 为了清楚起见,我并不是在寻找最佳算法,而是希望可以在CUDA中快速实现的最佳算法比我的CPU实现有明显的提高。在这个项目中,程序员的时间比计算机的时间更多地是一个限制因素。 我还应该澄清,异步蜂窝自动机与同步自动机是完全不同的事情,并且并行化同步CA的技术(例如Conway的生活)不能轻易地适应此问题。区别在于,同步CA在每个时间步同时更新每个小区,而异步CA在每个时间步更新随机选择的本地区域,如下所述。 我希望并行化的模型是在由约100000个单元组成的网格(通常是六角形)上实现的(尽管我想使用更多),用于运行它们的非并行算法如下所示: 随机选择一对相邻的单元格 根据围绕这些单元格的局部邻域计算“能量”函数Δ èΔË\Delta E 以取决于的概率(使用为参数),要么交换两个单元的状态,要么不执行任何操作。Ë- βΔ èË-βΔËe^{-\beta \Delta E}ββ\beta 无限重复上述步骤。 边界条件也有一些复杂性,但是我想这些对于并行化不会造成太大困难。 值得一提的是,我对这些系统的瞬态动力学感兴趣,而不仅仅是平衡状态,因此我需要具有与上述等效的动力学特性的东西,而不是仅仅具有相同平衡分布的东西。(因此,chequerboard算法的变化不是我想要的。) 并行化上述算法的主要困难是冲突。由于所有计算仅取决于晶格的局部区域,因此许多晶格位点可以并行更新,只要它们的邻域不重叠即可。问题是如何避免这种重叠。我可以想到几种方法,但是我不知道哪种方法最适合实施。这些如下: 使用CPU生成随机网格站点的列表并检查冲突。当网格站点的数量等于GPU处理器的数量时,或者如果检测到冲突,请将每组坐标发送到GPU单元以更新相应的网格站点。这将很容易实现,但可能不会大大提高速度,因为检查CPU上的冲突可能不会比对CPU进行整个更新便宜得多。 将网格划分为区域(每个GPU单元一个),并拥有一个GPU单元负责随机选择和更新其区域内的网格单元。但是这个想法有很多我不知道如何解决的问题,最明显的是当一个单位选择一个与其区域边缘重叠的邻域时应该发生什么。 大致如下所示:让时间分步进行。将晶格分成不同的根据某个预定义方案在每个时间步上设置一组区域,并让每个GPU单元随机选择和更新一对邻域不与区域边界重叠的网格单元。由于边界每时每刻都在变化,因此只要区域相对较大,此约束就不​​会对动力学产生太大影响。这似乎易于实现并且可能很快,但是我不知道它对动态的近似程度,或者在每个时间步长上选择区域边界的最佳方案是什么。我发现了一些对“块同步细胞自动机”的引用,它们可能与这个想法相同或不同。(我不知道,因为似乎该方法的所有描述要么都是俄语的,要么是我无法访问的资源。) 我的具体问题如下: 以上任何算法是否是处理异步CA模型的GPU并行化的明智方法? 有没有更好的办法? 是否存在针对此类问题的现有库代码? 在哪里可以找到“块同步”方法的清晰英语描述? 进展 我相信我已经想出了一种可能合适的并行化异步CA的方法。下面概述的算法适用于一次仅更新一个单元的普通异步CA,而不是像我的那样更新相邻的一对单元。将其推广到我的具体情况有一些问题,但是我认为我有一个解决方案的想法。但是,由于下面讨论的原因,我不确定它将带来多少速度优势。 这个想法是用等效的随机同步CA(SCA)代替异步CA(以下称为ACA)。为此,我们首先想到ACA是一个泊松过程。即,时间连续进行,并且每个单元以每单位时间执行其更新功能的恒定概率独立于其他单元。 我们构造了一个SCA,该SCA的每个单元均存储两件事:该单元的状态 (即,在顺序实现中将存储在每个单元中的数据),以及一个浮点数代表(连续)时,在其将在下一次更新。此连续时间不对应于SCA的更新步骤。我将后者称为“逻辑时间”。时间值根据指数分布随机初始化:。(其中是一个可以任意选择其值的参数。)X我ĴX一世ĴX_{ij}Ť我ĴŤ一世Ĵt_{ij}Ť我Ĵ(0 )〜精通(λ )Ť一世Ĵ(0)〜经验值⁡(λ)t_{ij}(0) \sim \operatorname{Exp}(\lambda)λλ\lambda 在每个逻辑时间步,SCA的单元将更新如下: 如果对于附近的任何,时间,则不执行任何操作。ķ ,升ķ,升k, l我,Ĵ一世,Ĵi,jŤķ 升&lt; 吨我ĴŤķ升&lt;Ť一世Ĵt_{kl}<t_{ij} 否则,(1)使用与原始ACA相同的规则,根据相邻小区的状态更新状态;(2)生成一个随机值并将更新为。X我ĴX一世ĴX_{ij}Xķ 升Xķ升X_{kl}Δ 吨〜精通(λ )ΔŤ〜经验值⁡(λ)\Delta t \sim \operatorname{Exp}(\lambda)Ť我ĴŤ一世Ĵt_{ij}Ť我Ĵ+ Δ 吨Ť一世Ĵ+ΔŤt_{ij}+\Delta t …

3
具有已知边界的多维积分的数值积分
我有一个(二维)不正确的积分 一世= ∫一个w ^(x ,y)F(x ,y)d x d yI=∫AW(x,y)F(x,y)dxdyI=\int_A \frac{W(x,y)}{F(x,y)}\,\mbox{d}x\mbox{d}y 其中积分的域小于X = [ - 1 ,1 ],ÿ = [ - 1 ,1 ]但通过进一步限制˚F (X ,ÿ )&gt; 0。由于F和W平滑且W ≠ 0一个AAX = [ - 1 ,1 ]x=[−1,1]x=[-1,1]ÿ= [ - 1 ,1 ]y=[−1,1]y=[-1,1]F(x ,y)&gt; 0F(x,y)&gt;0F(x,y)>0FFFw ^WWw ^≠ 0W≠0W \ne 0在边界处,后一种关系意味着被积物在边界处可以是奇异的。但是,被积数是有限的。到目前为止,我已经使用嵌套数值积分计算了该积分。这是成功的但很慢。我寻找一种更合适(更快)的方法来解决积分问题,也许是蒙特卡洛方法。但是我需要一个不将点放在非三次域A的边界上并且正确地接受不适当积分的极限的函数。积分转换可以帮助此一般表达吗?请注意,我可以解决为Ÿ作为函数X,甚至计算出我的一些特殊功能,重量w ^ (F(x ,y)F(x,y)F(x,y)ÿyyXxx一世II。w …

1
替换C ++中的Mathematica的QuasiMonteCarlo集成
我有一个Mathematica程序,使用该QuasiMonteCarlo方法在3或4维中执行一些积分。问题是,要花费一些令人讨厌的时间,以致于某些计算无法在我们的HPC群集上提供的最大工作时间内完成。因此,我正在考虑用C ++重写该程序,我怀疑它将大大提高它的速度。 我查看了GSL文档,虽然有关于准随机序列和常规MC集成的部分,但没有任何东西可以将它们组合在一起。同样,一两个Google搜索并没有发现任何看起来像是广受信任的实现。在C ++中,经过良好测试的QMC集成实现方式有哪些选择? 为了保持一致性,如果可以选择,我宁愿使用Mathematica实现的类似于Halton-Hammersley-Wozniakowski方法的方法。

3
在什么情况下,蒙特卡洛积分比准蒙特卡洛积分更好?
一个简单的问题:做一个多维积分,假设已经确定某种蒙特卡罗方法是合适的,那么使用伪随机数的常规MC积分相对于使用准随机序列的准蒙特卡洛积分有何优势? ?如果是这样,我将如何认识到发挥这种优势的情况?(如果没有,为什么有人会使用普通的旧蒙特卡洛积分?)

2
通过蒙特卡洛采样估计信息熵
我正在寻找一种方法,当从该分布进行采样的唯一实际方法是蒙特卡洛方法时,该方法可以估计该分布的信息熵。 我的问题与标准的Ising模型没有什么不同,该模型通常用作Metropolis-Hastings采样的入门示例。我有超过一组的概率分布,即我有p (一)对于每个一∈ 甲。元素一∈ 一个是组合性质的,伊辛状态,并且有一个非常高的数字他们的。这意味着在实践中,从计算机上的此分布进行采样时,我永远不会两次获得相同的采样。p (a )不能直接计算(由于不知道归一化因子),但是比率p (a一个AAp (a )p(a)p(a)一∈ 一a∈Aa \in A一∈ 一a∈Aa \in Ap (a )p(a)p(a)很容易计算。p (一1个)/ p (a2)p(a1)/p(a2)p(a_1)/p(a_2) 我想估计这种分布的信息熵 S=−∑a∈Ap(a)lnp(a).S=−∑a∈Ap(a)ln⁡p(a). S = -\sum_{a \in A} p(a) \ln p(a). 或者,我想估计此分布与通过将分布限制为的子集(当然还有重新归一化)而获得的熵差。a∈A1⊂Aa∈A1⊂Aa\in A_1 \subset A

3
如何在双曲空间中采样点?
庞加莱上半空间模型中的双曲空间看起来像普通的RnRn\Bbb R^n但是角度和距离的概念以相对简单的方式变形了。在欧几里德空间我可以均匀地在球磨机中在几个方面,例如,通过生成采样的随机点nnn独立高斯样本以获得一个方向,并分别进行采样径向坐标rrr通过均匀采样sss从[0,1n+1Rn+1][0,1n+1Rn+1]\left[0, \frac1{n+1}R^{n+1}\right],其中RRR是半径,设置r=((n+1)s)1n+1r=((n+1)s)1n+1r = \left((n+1)s\right)^{\frac1{n+1}}。在双曲上半平面中,一个球碰巧仍然是一个球,只有其中心不会成为欧几里得度量的中心,因此我们可以这样做。 如果我们要根据非均匀分布进行采样,但仍以各向同性的方式(例如高斯分布)进行采样,这似乎并不容易。在欧几里得空间中,我们可以为每个坐标生成一个高斯样本(这仅适用于高斯分布),或者等效地生成多维高斯样本。是否有直接方法将此样本转换为双曲空间中的样本? 一种替代方法是首先生成一个方向均匀分布的方向(例如,从nñn高斯样本中),然后生成一个用于径向分量的高斯样本,最后在指定方向上针对指定长度在指数映射下生成图像。一种变化是仅采用欧几里得高斯样本并将其映射在指数映射下。 我的问题: 在双曲空间中具有给定的均值和标准差的高斯样本的最佳有效方法是什么? 我上面描述的方式能否提供所需的采样? 有人解决这个公式了吗? 如何将其推广到其他指标和其他概率分布? 提前致谢。 编辑 我只是意识到,即使在统一抽样的情况下,这些问题仍然存在。即使球是球,也不能用球上的常数函数来描述均匀分布。

2
用于随机计算函数的方程求解的数值方法
有许多众所周知的数值方法可以求解类型为 例如二等分法,牛顿法等。F(x )= 0 ,X ∈ řñ,f(x)=0,x∈Rn, f(x) = 0, \quad x \in \mathbb{R}^n, 在我的应用程序中,是用随机方法计算的(结果是平均值)。F(x )f(x)f(x) 有什么数值方程求解方法可以很好地处理这种情况?也欢迎链接到任何类似情况的讨论。 我可以计算的精度很大程度上取决于,并且我很容易碰到一堵墙,在不显着增加计算时间的情况下无法提高精度。因此,我不能忽略的结果不精确的事实。这也将影响实际中可以找到的精度。F(x )f(x)f(x)XxxFffXxx

2
关于量子蒙特卡洛的困惑
我的问题是关于从QMC方法中提取可观察物,如本参考资料中所述。 我了解各种QMC方法(例如路径积分蒙特卡洛)的形式派生。但是,到最后,我仍然对如何有效使用这些技术感到困惑。 量子MC方法推导的基本思想是通过Trotter近似离散化算子,该算子可以是量子系统的密度矩阵或时间演化算子。然后,我们获得了具有附加维度的经典系统,可以使用MC方法对其进行处理。 考虑到我们可以解释在量子算符ë - β ħ既作为逆温度和虚时间,这些算法的目的应该是计算该操作者的近似。确实,如果我们直接从模拟采样的各种配置中测量量,那么在“逆温度”情况下,我们将有一些样本遵循基于β / M的概率密度,其中Mββ\betaË- βH^e−βH^e^{−\beta\hat{H}}β/米β/M\beta/M中号MM是Trotter分解中引入的离散步骤数。取而代之的是,在“虚假时间”情况下,我们将在各个离散的时间步长上获取样本,从而也获得沿时间的平均值。我们也不会获得像数量在给定时间吨,与甲一些可观察到的操作者。⟨ ψŤ| 一个^| ψŤ⟩⟨ψt|A^|ψt⟩\langle\psi_t|\hat{A}|\psi_t\rangleŤtt一个^A^\hat{A} 但是,我认为我们直接从这种模拟中采样了数量(摘自文档的(5.34),第35页): O¯≡⟨O^(X)⟩≡1N!∑P∫O(X)π(X,P)dXO¯≡⟨O^(X)⟩≡1N!∑P∫O(X)π(X,P)dX\bar{O} \equiv \langle \hat{O}(X) \rangle \equiv \frac{1}{N!} \sum_P \int O(X) \pi(X,P) dX 给定额外的维数,它不能是与量子系统有关的量。取而代之的是,可以通过公式(5.35)计算正确的量子量,该公式在每个样本中包含模拟配置的整链:MMM EthN=⟨d2τ−m2(ℏτ)2MN∑j=1M(Rj−Rj+1)2+1MN∑j=1MV(Rj)⟩EthN=⟨d2τ−m2(ℏτ)2MN∑j=1M(Rj−Rj+1)2+1MN∑j=1MV(Rj)⟩\frac{E_{th}}{N}= \left\langle \frac{d}{2 \tau} - \frac{m}{2 (\hbar \tau)^2MN } \sum_{j=1}^{M} (\mathbf{R}_j -\mathbf{R}_{j+1})^2 + \frac{1}{MN} \sum_{j=1}^{M} V(\mathbf{R}_j) \right\rangle 我是否需要一系列QMC模拟来提取有关给定可观测量的有用信息,对吗?

3
最大化未知噪声功能
我感兴趣的最大化函数,其中θ &Element; [R p。F(θ)f(θ)f(\mathbf \theta)θ∈Rpθ∈Rp\theta \in \mathbb R^p 问题是我不知道函数或其派生类的解析形式。我能做的唯一的事情是评价功能的逐点,通过在插入值,并获得噪声估计˚F(θ *),在这一点上。如果我愿意,我可以减少这些估计的可变性,但是我必须支付增加的计算成本。 θ∗θ∗\theta_*f^(θ∗)f^(θ∗)\hat{f}(\theta_*) 到目前为止,这是我尝试过的: 具有有限差异的随机最陡下降:它可以工作,但需要大量的调整(例如,增益序列,比例因子),并且通常非常不稳定。 模拟退火:它可以工作并且可靠,但是需要大量功能评估,因此我发现它相当慢。 因此,我想就在这种情况下可以使用的替代优化方法提出建议/想法。我将问题尽可能地笼统,以鼓励来自与我不同的研究领域的建议。我必须补充一点,我对一种可以使我估计收敛时的黑森州的方法非常感兴趣。这是因为我可以用它来估计参数的不确定性。否则,我将不得不在最大值附近使用有限的差异来获得估计值。θθ\theta

3
从正态分布的有限混合中抽取样本?
经过一些贝叶斯更新步骤后,剩下的是正态分布混合形式的后验分布也就是说,参数\ theta是从一个分布中得出的,该分布的PDF是正常PDF的加权混合,而不是正常RV的总和。我想绘制样本\ theta \ sim \ Pr(\ theta | \ text {data})以用于此后验的重要性采样近似。实际上,i上的总和可能包含大量项,因此根据权重\ {w_i \}选择项i然后绘制\ theta \ sim N(\ mu_i,\ sigma ^ 2)θ θ 〜镨(θ |数据)我我{ 瓦特我 } θ 〜Ñ (μ 我,σ 2)Pr (θ | data )= ∑我= 1ķw一世ñ(μ一世,σ2)。镨(θ|数据)=∑一世=1个ķw一世ñ(μ一世,σ2)。\Pr(\theta| \text{data} ) = \sum_{i=1}^k w_i N(\mu_i, \sigma^2).θθ\thetaθ 〜镨(θ |数据)θ〜镨(θ|数据)\theta\sim\Pr(\theta|\text{data})一世一世i一世一世i{ w一世}{w一世}\{w_i\}θ 〜Ñ(μ一世,σ2)θ〜ñ(μ一世,σ2)\theta\sim N(\mu_i, …

2
管理模拟运行的建议?
在comp-sci中,这个问题可能有点偏离主题。如果需要,请提出适合的地方。 问题是关于如何有效管理所有模拟运行。 比方说,例如,模拟需要固定2个参数,这些参数必须在某个建议值范围内定义。 为了找到由两个参数中的一个对产生的更好结果(例如,通过将模拟结果与实验数据进行比较),可以通过为每个参数定义三个值然后进行9次运行来进行灵敏度分析。 以前,我使用sed更改每次运行的输入,并通过在存储此运行的输入和结果的文件夹中写入值和参数名称来标记每次运行。但是我发现,一旦参数数量增加(例如,访问脚本中的文件夹名称以进行绘图),效率将非常低下。 然后我决定使用简单数字作为文件夹名称,并通过其他一些电子表格存储详细信息。到目前为止,这种方式还可以,但是需要一些费力的工作。而且随着运行次数的增加,经常会犯错误,例如进行几天前已经完成的另一次运行。 您对管理这些运行有什么好主意吗?我认为这对于进行蒙特卡洛分析的人来说非常重要? 提前致谢!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.