Sekwencja Haltona

256 punktów z pierwszych 256 punktów sekwencji Haltona 2,3 (na górze) w porównaniu ze źródłem liczb pseudolosowych (na dole). Sekwencja Haltona pokrywa przestrzeń bardziej równomiernie. (czerwony=1,...10, niebieski=11,...100, zielony=101,...256)

W statystyce sekwencje Haltona sekwencjami używanymi do generowania punktów w przestrzeni dla metod numerycznych, takich jak symulacje Monte Carlo . Chociaż te sekwencje są deterministyczne , mają niewielką rozbieżność , to znaczy wydają się być losowe z wielu powodów. Zostały one po raz pierwszy wprowadzone w 1960 roku i są przykładem quasi-losowej sekwencji liczb. Uogólniają jednowymiarowe sekwencje van der Corput .

Przykład sekwencji Haltona użytej do wygenerowania punktów w (0, 1) × (0, 1) w R 2

Ilustracja pierwszych 8 punktów ciągu 2,3 ​​Haltona

Sekwencja Haltona jest konstruowana zgodnie z metodą deterministyczną, która wykorzystuje liczby względnie pierwsze jako podstawy. Jako prosty przykład przyjmijmy, że jeden wymiar ciągu Haltona jest oparty na 2, a drugi na 3. Aby wygenerować ciąg dla 2, zaczynamy od podzielenia przedziału (0,1) na pół, następnie na czwarte, ósemki itp., który generuje

1 / 2 ,
1 / 4 , 3 / 4 ,
1 / 8 , 5 / 8 , 3 / 8 , 7 / 8 ,
1 / 16 , 9 / 16 , ...

0 Równoważnie, n-tą liczbą tego ciągu jest liczba n zapisana w postaci binarnej, odwrócona i zapisana po przecinku. Dotyczy to dowolnej bazy. Na przykład, aby znaleźć szósty element powyższej sekwencji, zapisalibyśmy 6 = 1*2 2 + 1*2 1 + 0*2 = 110 2 , co można odwrócić i umieścić po przecinku, aby uzyskać 0,011 2 = 0*2-1 + 1*2-2 + 1* 2-3 = 3 8 . Więc sekwencja powyżej jest taka sama jak

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 ,...

Aby wygenerować sekwencję dla 3, dzielimy przedział (0,1) na tercje, następnie dziewiąte, dwudzieste siódme itd., co generuje

1 / 3 , 2 / 3 , 1 / 9 , 4 / 9 , 7 / 9 , 2 / 9 , 5 / 9 , 8 / 9 , 1 / 27 , ...

Kiedy połączymy je w pary, otrzymamy ciąg punktów w kwadracie jednostkowym:

( 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 ).

Chociaż standardowe sekwencje Haltona działają bardzo dobrze w małych wymiarach, zauważono problemy z korelacją między sekwencjami wygenerowanymi z wyższych liczb pierwszych. Na przykład, jeśli zaczęliśmy od liczb pierwszych 17 i 19, pierwszych 16 par punktów: ( 1 / 17 , 1 / 19 ), ( 2 / 17 , 2 / 19 ), ( 3 / 17 , 3 / 19 ) . .. ( 16 / 17 , 16 / 19 ) miałby idealną korelację liniową . Aby tego uniknąć, często odrzuca się pierwsze 20 wpisów lub inną z góry określoną liczbę w zależności od wybranych liczb pierwszych. Zaproponowano również kilka innych metod. Jednym z najbardziej znanych rozwiązań jest zaszyfrowana sekwencja Haltona, która wykorzystuje permutacje współczynników użytych do budowy sekwencji standardowej. Innym rozwiązaniem jest skaczący Halton, który pomija punkty w standardowej sekwencji. Używając np. tylko każdego 409. punktu (możliwe są też inne liczby pierwsze nie używane w ciągu rdzenia Haltona), można osiągnąć znaczną poprawę.

Realizacja

W pseudokodzie:

    
    

    
    

      
        
         algorytm  Halton-Sekwencja  to  dane wejściowe  : indeks  podstawa  wyjście  : wynik  podczas gdy  zrobić 
        

      powrót 

Alternatywna implementacja, która tworzy kolejne liczby sekwencji Haltona dla podstawy b , jest podana w poniższej funkcji generatora (w Pythonie ). Algorytm ten używa wewnętrznie tylko liczb całkowitych, co czyni go odpornym na błędy zaokrągleń.

 
    
       0 
     
            
           
              
              
        
                
               
                  def  halton_sequence  (  b  ):  """Funkcja generatora dla ciągu Haltona."""  n  ,  d  =  ,  1  while  True  :  x  =  d  -  n  if  x  ==  1  :  n  =  1  d  *=  b  else  :  y  =  d  //  b  podczas gdy  x  <=  y  :  y  //=  
                    
            b  n  =  (  b  +  1  )  *  y  -  x  wydajność  n  /  re 

Zobacz też