Ich versuche, mit Julia eine Autokorrelation durchzuführen und sie mit Pythons Ergebnis zu vergleichen. Wie kommt es, dass sie unterschiedliche Ergebnisse liefern?
Julia Code
using StatsBase
t = range(0, stop=10, length=10)
test_data = sin.(exp.(t.^2))
acf = StatsBase.autocor(test_data)
gibt
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-Code
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)
gibt
array([ 1. , 0.14589844, -0.10412699, 0.07817509, -0.12916543,
-0.03469143, -0.129255 , -0.15982435, -0.02067688, -0.14633346])
Antworten:
Das liegt daran, dass Sie
test_data
anders sind:Python:
Julia:
Dies geschieht, weil Sie
sin
enorme Zahlen nehmen. Zum Beispiel ist die letzte Zahlt
10exp(10^2)
~ 2,7 * 10 ^ 43. Auf dieser Skala betragen die Gleitkomma-Ungenauigkeiten etwa 3 * 10 ^ 9. Wenn also auch das niedrigstwertige Bit für Python und Julia unterschiedlich ist, ist dersin
Wert weit entfernt.Tatsächlich können wir die zugrunde liegenden Binärwerte des anfänglichen Arrays untersuchen
t
. Zum Beispiel unterscheiden sie sich im drittletzten Wert:Julia:
Python:
Wir können in der Tat sehen, dass sie durch genau eine Maschine epsilon nicht übereinstimmen. Und wenn wir Julia verwenden, nehmen Sie
sin
den von Python erhaltenen Wert:Wir erhalten den gleichen Wert, den Python hat.
quelle
Nur um die Antwort ein wenig zu erweitern (als Antwort hinzufügen, da sie für einen Kommentar zu lang ist). In Julia haben Sie Folgendes:
während in Python:
und Sie sehen, dass die 8. Zahl in Python eine ungenaue Annäherung an ist
70/9
, während Sie in Julia in diesem Fall die Folge der engsten Annäherungen an die10*i/9
Verwendung erhaltenFloat64
.Es scheint also, dass der Rest dem folgt, was @Jakob Nissen kommentiert hat, weil sich die ursprünglichen Sequenzen unterscheiden.
Die Dinge sind jedoch nicht so einfach. Da
exp
Funktionen in Julia und Python sich ein wenig in dem unterscheiden, was sie produzieren. Siehe Python:während in Julia:
(Sie können überprüfen, ob
(20/3)^2
diesFloat64
sowohl in Julia als auch in Python gleich ist).In diesem Fall ist
exp
Python also etwas genauer als Julia. Daher wird selbst das Korrigierent
(was durch die Verwendung eines Verständnisses in Python anstelle von einfach istlinspace
) nicht dazu führen, dass der ACF gleich ist.Alles in allem ist die Schlussfolgerung, was @Jakob Nissen für so große Werte kommentierte, dass die Ergebnisse stark von den numerischen Ungenauigkeiten beeinflusst werden.
quelle