Estou tentando fazer a autocorrelação usando Julia e compará-lo com o resultado do Python. Como eles dão resultados diferentes?
Código Julia
using StatsBase
t = range(0, stop=10, length=10)
test_data = sin.(exp.(t.^2))
acf = StatsBase.autocor(test_data)
dá
10-element Array{Float64,1}:
1.0
0.13254954979179642
-0.2030283419321465
0.00029587850872956104
-0.06629381497277881
0.031309038331589614
-0.16633393452504994
-0.08482388975165675
0.0006905628640697538
-0.1443650483145533
Código Python
from statsmodels.tsa.stattools import acf
import numpy as np
t = np.linspace(0,10,10)
test_data = np.sin(np.exp(t**2))
acf_result = acf(test_data)
dá
array([ 1. , 0.14589844, -0.10412699, 0.07817509, -0.12916543,
-0.03469143, -0.129255 , -0.15982435, -0.02067688, -0.14633346])
Respostas:
Isso ocorre porque o seu
test_data
é diferente:Pitão:
Julia:
Isso acontece porque você está recebendo
sin
números enormes. Por exemplo, com o último númerot
sendo 10,exp(10^2)
é ~ 2,7 * 10 ^ 43. Nessa escala, as imprecisões de ponto flutuante são de cerca de 3 * 10 ^ 9. Portanto, se mesmo o bit menos significativo for diferente para Python e Julia, osin
valor será muito diferente.De fato, podemos inspecionar os valores binários subjacentes da matriz inicial
t
. Por exemplo, eles diferem no terceiro último valor:Julia:
Pitão:
Podemos de fato ver que eles discordam exatamente de uma máquina épsilon. E se usarmos Julia, pegue
sin
o valor obtido pelo Python:Temos o mesmo valor que o Python recebe.
fonte
Apenas para expandir um pouco a resposta (adicionando como resposta, pois é muito longa para um comentário). Em Julia, você tem o seguinte:
enquanto em Python:
e você vê que o 8º número em Python é uma aproximação imprecisa de
70/9
, enquanto em Julia, nesse caso, você obtém a sequência das aproximações mais próximas de10*i/9
usoFloat64
.Parece que, como as seqüências originais diferem, o resto segue o que @Jakob Nissen comentou.
No entanto, as coisas não são assim tão simples. Como as
exp
funções em Julia e Python diferem um pouco no que produzem. Veja Python:enquanto em Julia:
(você pode verificar se
(20/3)^2
é o mesmoFloat64
em Julia e Python).Portanto, neste caso, o
exp
Python é um pouco mais preciso do que Julia. Portanto, mesmo a correçãot
(que é fácil usando uma compreensão em Python em vez delinspace
) não tornará o ACF igual.Em suma, a conclusão é o que @Jakob Nissen comentou por valores tão grandes que os resultados serão fortemente influenciados pelas imprecisões numéricas.
fonte