Próbuję przeprowadzić autokorelację za pomocą Julii i porównać ją z wynikiem Pythona. Dlaczego dają różne wyniki?
Kod Julii
using StatsBase
t = range(0, stop=10, length=10)
test_data = sin.(exp.(t.^2))
acf = StatsBase.autocor(test_data)
daje
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
Kod Pythona
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)
daje
array([ 1. , 0.14589844, -0.10412699, 0.07817509, -0.12916543,
-0.03469143, -0.129255 , -0.15982435, -0.02067688, -0.14633346])
Odpowiedzi:
To dlatego, że twój
test_data
jest inny:Pyton:
Julia:
Dzieje się tak, ponieważ bierzesz
sin
ogromne liczby. Na przykład, gdy ostatnia liczbat
to 10,exp(10^2)
to ~ 2,7 * 10 ^ 43. W tej skali niedokładności zmiennoprzecinkowe wynoszą około 3 * 10 ^ 9. Więc jeśli nawet najmniej znaczący bit jest inny dla Pythona i Julii,sin
wartość będzie daleka.W rzeczywistości możemy sprawdzić podstawowe wartości binarne początkowej tablicy
t
. Na przykład różnią się trzecią ostatnią wartością:Julia:
Pyton:
Rzeczywiście możemy zobaczyć, że nie zgadzają się dokładnie przez jedną maszynę epsilon. A jeśli użyjemy Julii, weźmy
sin
wartość uzyskaną przez Pythona:Otrzymujemy tę samą wartość, co Python.
źródło
Wystarczy rozwinąć nieco odpowiedź (dodając jako odpowiedź, ponieważ jest ona zbyt długa na komentarz). W Julii masz:
podczas gdy w Pythonie:
i widzisz, że ósma liczba w Pythonie jest niedokładnym przybliżeniem
70/9
, podczas gdy w Julii w tym przypadku otrzymujesz sekwencję najbliższych przybliżeń10*i/9
użyciaFloat64
.Wydaje się, że ponieważ oryginalne sekwencje różnią się od ciebie, reszta postępuje zgodnie z komentarzem @Jakob Nissen.
Jednak rzeczy nie są takie proste. Ponieważ
exp
funkcje w Julii i Pythonie różnią się nieco tym, co produkują. Zobacz Python:podczas pobytu w Julii:
(możesz sprawdzić, czy
(20/3)^2
to samo dotyczyFloat64
zarówno Julii, jak i Pythona).Tak więc w tym przypadku
exp
Python jest nieco dokładniejszy niż Julia. Dlatego nawet poprawianiet
(co jest łatwe dzięki użyciu zrozumienia w Pythonie zamiastlinspace
) nie sprawi, że ACF będzie równy.Podsumowując, to, co skomentował @Jakob Nissen dla tak dużych wartości, na wyniki będą silnie wpływać niedokładności liczbowe.
źródło