低差异序列 (low

您所在的位置:网站首页 lingo怎么使用for函数产生序列 低差异序列 (low

低差异序列 (low

2024-07-13 22:44| 来源: 网络整理| 查看: 265

Halton序列

在统计学中,Halton序列是用于生成空间中的点的序列,如Monte Carlo模拟的数值方法,虽然这些序列是确定性的,但它们的差异性很低,也就是说,在许多方面看起来是随机的。它们在1960年首次提出,是准随机数列的一个例子。它们概括了一维Van der Corput序列

用于生成 R 2 R^2 R2中(0,1)x(0,1)点的Halton序列的例子

Halton数列是以质数为基的确定性方法构造的。举个简单的例子,让我们把Halton序列的一个维度基于2,另一个基于3。为了生成2的序列,我们首先将区间 ( 0 , 1 ) (0,1) (0,1)分成两半,然后分成四分之一、八分之一等,这就产生了 1 2 , 1 4 , 3 4 , 1 8 , 5 8 , 3 8 , 7 8 , 1 16 , 9 16 . . . \frac{1}{2},\frac{1}{4},\frac{3}{4},\frac{1}{8},\frac{5}{8},\frac{3}{8},\frac{7}{8},\frac{1}{16},\frac{9}{16}... 21​,41​,43​,81​,85​,83​,87​,161​,169​... 等价的,这个序列的第n个数字是用二进制表示的数字n,倒过来,并写在小数点之后。这对任何基数都是如此。举个例子,要找到上述序列的第六个元素,我们要写 6 = 1 ∗ 2 2 + 1 ∗ 2 1 + 0 ∗ 2 0 = 11 0 2 6=1*2^2+1*2^1+0*2^0=110_2 6=1∗22+1∗21+0∗20=1102​,可以倒置并放在小数点之后,得到 0.01 1 2 = 0 ∗ 2 − 1 + 1 ∗ 2 − 2 + 1 ∗ 2 − 3 = 3 8 0.011_2=0*2^{-1}+1*2^{-2}+1*2^{-3}=\frac{3}{8} 0.0112​=0∗2−1+1∗2−2+1∗2−3=83​。所以上面的序列与 0. 1 2 , 0.0 1 2 , 0.1 1 2 , 0.00 1 2 , 0.10 1 2 , 0.01 1 2 , 0.11 1 2 , 0.000 1 2 , 0.100 1 2 0.1_2,0.01_2,0.11_2,0.001_2,0.101_2,0.011_2,0.111_2,0.0001_2,0.1001_2 0.12​,0.012​,0.112​,0.0012​,0.1012​,0.0112​,0.1112​,0.00012​,0.10012​相同 为了生成3的序列,我们把区间 ( 0 , 1 ) (0,1) (0,1)分成三份,然后是九份,二十七份,等等…这就产生了(同理表示成三进制的数,然后进行相应操作) 1 3 , 2 3 , 1 9 , 4 9 , 7 9 , 2 9 , 5 9 , 8 9 , 1 27 , . . . \frac{1}{3},\frac{2}{3},\frac{1}{9},\frac{4}{9},\frac{7}{9},\frac{2}{9},\frac{5}{9},\frac{8}{9},\frac{1}{27},... 31​,32​,91​,94​,97​,92​,95​,98​,271​,...

当我们把它们配对起来时,我们会得到一个单位方格中的点的序列。 ( 1 2 , 1 3 ) , ( 1 4 , 2 3 ) , ( 3 4 , 1 9 ) , ( 1 8 , 4 9 ) , ( 5 8 , 7 9 ) , ( 3 8 , 2 9 ) , ( 7 8 , 5 9 ) , ( 1 16 , 8 9 ) , ( 9 16 , 1 27 ) . (\frac{1}{2},\frac{1}{3}),(\frac{1}{4},\frac{2}{3}),(\frac{3}{4},\frac{1}{9}),(\frac{1}{8},\frac{4}{9}),(\frac{5}{8},\frac{7}{9}),(\frac{3}{8},\frac{2}{9}),(\frac{7}{8},\frac{5}{9}),(\frac{1}{16},\frac{8}{9}),(\frac{9}{16},\frac{1}{27}). (21​,31​),(41​,32​),(43​,91​),(81​,94​),(85​,97​),(83​,92​),(87​,95​),(161​,98​),(169​,271​). 尽管标准的Halton序列在低维情况下表现的很好,但由高质数生成的序列之间存在相关问题。例如,如果我们从质数17和19开始,前16个对点数: ( 1 17 , 1 19 ) , ( 2 17 , 2 19 ) , ( 3 17 , 3 19 ) . . . ( 16 17 , 16 19 ) (\frac{1}{17},\frac{1}{19}),(\frac{2}{17},\frac{2}{19}),(\frac{3}{17},\frac{3}{19})...(\frac{16}{17},\frac{16}{19}) (171​,191​),(172​,192​),(173​,193​)...(1716​,1916​)具有完美的线性相关性。为了避免这种情况,通常会删除前20个条目,或者根据选择的指数来删除其他预定的数量。还提出了其他几种办法,最突出的解决方案之一是scrambled Halton序列,它使用在构建标准序列中使用的系数的排列组合。另一个解决方案是leaped Halton,它会在标准序列中跳过点(例如,只有每409个点(也可以是其他没有在Halton核心序列中使用的质数),才能取得显著的改进)。

实现 伪代码 algorithm Halton-Sequence is inputs: index i base b output: result r f⬅1 r⬅0 while i > 0 do f⬅f/b r⬅r+f * (i mod b) i⬅[i/b] return r

下面的生成器函数 generator function (Python)中给出了另一种实现方式,它可以产生以 b b b为基数的Halton序列的后续数字。这种算法在内部只使用整数,这使得它对四舍五入的错误具有很强的健壮性。

def halton(b): """Generator function for Halton sequence.""" n, d = 0, 1 while True: x = d - n if x == 1: n = 1 d *= b else: y = d // b while x 0) { f = f / base; r = r + f * (index % base); index = index / base; } return r * randpoint_scale; } void halton_random() { // 此处讨论生成二维随机数,如要产生多维,base需要是不重复的质数即可 // 三维:base 2 3 5 for (uint i = 0u; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3