A resposta curta é sim! Pode funcionar e é tão simples quanto multiplicar o vetortn∈(0,1)d por um número inteiro m, e a obtenção da parte inteira de cada um de seus componentes.
A resposta mais longa é que sua intuição está correta, que na prática ela apresenta resultados variados, dependendo da escolha de:
- qual sequência você escolhe (Halton, Sobol, etc.)
- os parâmetros básicos (por exemplo, 2,3,5, ...)
- e, em menor grau, o valor de m.
No entanto, escrevi recentemente um post detalhado do blog "A eficácia irracional de sequências quase aleatórias , sobre como criar facilmente uma sequência de baixa discrepância aberta em dimensões arbitrárias, que é muito mais passível de discretização do que as sequências de baixa discrepância existentes, como as seqüências de Halton e Kronecker.
A seção da postagem chamada "Covering" trata especificamente da sua questão de discretizar as seqüências de baixa discrepância.
Nos quadrados da imagem a seguir (que indicam um ponto inteiro exclusivo da rede) com menos vermelho, implica uma distribuição mais uniforme, pois cada quadrado vermelho indica que a célula não contém um ponto azul. Pode-se ver claramente como até oRA sequência distribui pontos em comparação com outros métodos contemporâneos.
A solução é um método de recorrência aditivo (módulo 1) que generaliza o problema unidimensional cuja solução depende da proporção áurea. A solução para odtridimensional, depende de uma constante especial ϕd, Onde ϕd é o valor do menor valor real positivo de x de tal modo que
xd+1=x+1
Para d=1, ϕ1=1.618033989..., que é a proporção de ouro canônica.
Para d=2, ϕ2=1.3247179572..., que geralmente é chamada de constante de plástico e tem algumas propriedades bonitas. Esse valor foi conjecturado como provavelmente o valor ideal para um problema bidimensional relacionado [Hensley, 2002].
Jacob Rus publicou uma bela visualização dessa sequência bidimensional de baixa discrepância, que pode ser encontrada aqui .
Com esta constante especial em mãos, o cálculo da n- o termo agora é extremamente simples e rápido de calcular:
R:tn=αα0+nαα(mod1),n=1,2,3,...
whereαα=(1ϕd,1ϕ2d,1ϕ3d,...1ϕdd),
Obviamente, a razão pela qual isso é chamado de sequência de recorrência é porque a definição acima é equivalente a
R:tn+1=tn+αα(mod1)
Em quase todos os casos, a escolha de αα0 não altera as principais características e, por razões de óbvia simplicidade, αα0=00é a escolha usual. No entanto, existem alguns argumentos, relacionados à simetria, que sugerem queαα0=1/21/2 é uma escolha melhor.
O código Python é
# Use Newton-Rhapson-Method
def gamma(d):
x=1.0000
for i in range(20):
x = x-(pow(x,d+1)-x-1)/((d+1)*pow(x,d)-1)
return x
d=5
n=1000
# m can be any number.
# In the diagram above it is chosen to be exactly sqrt of n,
# simply to to make the visualization more intuitive
# so that ideally each cell should have exactly one dot.
m=10
g = gamma(d)
alpha = np.zeros(d)
for j in range(d):
alpha[j] = pow(1/g,j+1) %1
z = np.zeros((n, d))
c = (np.zeros((n,d)).astype(int)
for i in range(n):
z = (0.5 + alpha*(i+1)) %1
c = (np.floor(m *z)).astype(int)
print(c)
Espero que ajude!