J'essaie de faire une autocorrélation en utilisant Julia et de la comparer au résultat de Python. Comment se fait-il qu'ils donnent des résultats différents?
Code Julia
using StatsBase
t = range(0, stop=10, length=10)
test_data = sin.(exp.(t.^2))
acf = StatsBase.autocor(test_data)
donne
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
Code 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)
donne
array([ 1. , 0.14589844, -0.10412699, 0.07817509, -0.12916543,
-0.03469143, -0.129255 , -0.15982435, -0.02067688, -0.14633346])
Réponses:
C'est parce que votre
test_data
est différent:Python:
Julia:
Cela se produit parce que vous prenez
sin
des nombres énormes. Par exemple, le dernier chiffret
étant 10,exp(10^2)
est ~ 2,7 * 10 ^ 43. À cette échelle, les inexactitudes en virgule flottante sont d'environ 3 * 10 ^ 9. Donc, même si le bit le moins significatif est différent pour Python et Julia, lasin
valeur sera bien différente.En fait, nous pouvons inspecter les valeurs binaires sous-jacentes du tableau initial
t
. Par exemple, ils diffèrent dans l'avant-dernière valeur:Julia:
Python:
Nous pouvons en effet voir qu'ils sont en désaccord avec exactement une machine epsilon. Et si nous utilisons Julia prendre
sin
la valeur obtenue par Python:Nous obtenons la même valeur que Python.
la source
Juste pour développer un peu la réponse (ajouter comme réponse car c'est trop long pour un commentaire). En Julia, vous avez les éléments suivants:
en Python:
et vous voyez que le 8ème nombre en Python est une approximation inexacte de
70/9
, tandis que dans Julia dans ce cas, vous obtenez la séquence d'approximations les plus proches de l'10*i/9
utilisationFloat64
.Il semblerait donc que parce que les séquences originales diffèrent, le reste suit ce que @Jakob Nissen a commenté.
Mais les choses ne sont pas si simples. Comme les
exp
fonctions de Julia et Python diffèrent un peu dans ce qu'elles produisent. Voir Python:à Julia:
(vous pouvez vérifier que
(20/3)^2
c'est la même choseFloat64
dans Julia et Python).Donc, dans ce cas,
exp
Python est légèrement plus précis que Julia. Par conséquent, même la fixationt
(ce qui est facile en utilisant une compréhension en Python au lieu delinspace
) ne rendra pas l'ACF égal.Dans l'ensemble, la conclusion est ce que @Jakob Nissen a commenté pour des valeurs aussi importantes, les résultats seront fortement influencés par les inexactitudes numériques.
la source