低差异序列 (low |
您所在的位置:网站首页 › lingo怎么使用for函数产生序列 › 低差异序列 (low |
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 |