Estoy tratando de hacer autocorrelación con Julia y compararlo con el resultado de Python. ¿Cómo es que dan resultados diferentes?
Código de Julia
using StatsBase
t = range(0, stop=10, length=10)
test_data = sin.(exp.(t.^2))
acf = StatsBase.autocor(test_data)
da
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 de 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)
da
array([ 1. , 0.14589844, -0.10412699, 0.07817509, -0.12916543,
-0.03469143, -0.129255 , -0.15982435, -0.02067688, -0.14633346])
Respuestas:
Esto se debe a que tu
test_data
es diferente:Pitón:
Julia
Esto sucede porque estás tomando
sin
cantidades enormes. Por ejemplo, con el último número ent
10,exp(10^2)
es ~ 2.7 * 10 ^ 43. En esta escala, las imprecisiones de coma flotante son aproximadamente 3 * 10 ^ 9. Entonces, incluso si el bit menos significativo es diferente para Python y Julia, elsin
valor estará muy lejos.De hecho, podemos inspeccionar los valores binarios subyacentes de la matriz inicial
t
. Por ejemplo, difieren en el tercer último valor:Julia
Pitón:
De hecho, podemos ver que no están de acuerdo con exactamente una máquina épsilon. Y si usamos Julia tomamos
sin
el valor obtenido por Python:Obtenemos el mismo valor que Python.
fuente
Solo para expandir un poco la respuesta (agregar como respuesta ya que es demasiado larga para un comentario). En Julia tienes lo siguiente:
mientras en Python:
y ves que el octavo número en Python es una aproximación inexacta de
70/9
, mientras que en Julia en este caso obtienes la secuencia de aproximaciones más cercanas de10*i/9
usoFloat64
.Entonces parece que debido a que las secuencias originales difieren, el resto sigue lo que comentó @Jakob Nissen.
Sin embargo, las cosas no son tan simples. Como las
exp
funciones en Julia y Python difieren un poco en lo que producen. Ver Python:mientras en Julia:
(puede verificar que
(20/3)^2
es lo mismoFloat64
tanto en Julia como en Python).Entonces, en este caso,
exp
Python es un poco más preciso que Julia. Por lo tanto, incluso la fijaciónt
(que es fácil usando una comprensión en Python en lugar delinspace
) no hará que el ACF sea igual.En general, la conclusión es lo que @Jakob Nissen comentó para valores tan grandes que los resultados estarán fuertemente influenciados por las imprecisiones numéricas.
fuente