Я пытаюсь сделать автокорреляцию с помощью Джулии и сравнить ее с результатом Python. Почему они дают разные результаты?
Юлия код
using StatsBase
t = range(0, stop=10, length=10)
test_data = sin.(exp.(t.^2))
acf = StatsBase.autocor(test_data)
дает
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
Код 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)
дает
array([ 1. , 0.14589844, -0.10412699, 0.07817509, -0.12916543,
-0.03469143, -0.129255 , -0.15982435, -0.02067688, -0.14633346])
Ответы:
Это потому что ты
test_data
другойPython:
Юлия:
Это происходит потому, что вы берете
sin
огромные числа. Например, с последним числом вt
10,exp(10^2)
это ~ 2,7 * 10 ^ 43. При этом масштабе погрешности с плавающей запятой составляют около 3 * 10 ^ 9. Так что если даже младший значащий бит отличается для Python и Julia,sin
значение будет далеко.Фактически, мы можем проверить основные двоичные значения исходного массива
t
. Например, они отличаются третьим последним значением:Юлия:
Python:
Мы действительно можем видеть, что они не согласны ровно на одной машине эпсилон. И если мы используем Джулию, возьмите
sin
значение, полученное Python:Мы получаем то же значение, что и Python.
источник
Просто чтобы немного расширить ответ (добавление в качестве ответа, поскольку это слишком долго для комментария). У Юлии у вас есть следующее:
в то время как в Python:
и вы видите, что 8-е число в Python является неточным приближением
70/9
, в то время как в Юлии в этом случае вы получаете последовательность ближайших приближений10*i/9
использованияFloat64
.Так что может показаться, что, поскольку исходные последовательности отличаются, остальное следует тому, что прокомментировал @Jakob Nissen.
Однако все не так просто. Поскольку
exp
функции в Julia и Python немного отличаются в том, что они производят. Смотрите Python:в то время как в Юлии:
(вы можете проверить, что
(20/3)^2
это одинаковоFloat64
и в Джулии, и в Питоне).Так что в этом случае с
exp
Python чуть точнее, чем с Юлией. Поэтому даже исправлениеt
(что легко с использованием понимания в Python вместоlinspace
) не сделает ACF равным.В целом вывод заключается в том, что @Jakob Nissen прокомментировал для таких больших значений, что результаты будут сильно зависеть от численных неточностей.
источник