Saya mencoba melakukan autokorelasi menggunakan Julia dan membandingkannya dengan hasil Python. Kenapa mereka memberikan hasil yang berbeda?
Kode julia
using StatsBase
t = range(0, stop=10, length=10)
test_data = sin.(exp.(t.^2))
acf = StatsBase.autocor(test_data)
memberi
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
Kode 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)
memberi
array([ 1. , 0.14589844, -0.10412699, 0.07817509, -0.12916543,
-0.03469143, -0.129255 , -0.15982435, -0.02067688, -0.14633346])
Jawaban:
Ini karena Anda
test_data
berbeda:Python:
Julia:
Ini terjadi karena Anda mengambil
sin
jumlah yang sangat besar. Misalnya, dengan angka terakhirt
menjadi 10,exp(10^2)
adalah ~ 2.7 * 10 ^ 43. Pada skala ini, ketidakakuratan floating point adalah sekitar 3 * 10 ^ 9. Jadi, bahkan jika bit paling tidak signifikan berbeda untuk Python dan Julia,sin
nilainya akan jauh.Bahkan, kita dapat memeriksa nilai-nilai biner yang mendasari array awal
t
. Misalnya, mereka berbeda dalam nilai terakhir ketiga:Julia:
Python:
Kita memang bisa melihat bahwa mereka tidak setuju dengan tepat satu mesin epsilon. Dan jika kita menggunakan Julia, ambil
sin
nilai yang diperoleh oleh Python:Kami mendapatkan nilai yang sama dengan Python.
sumber
Hanya untuk sedikit memperluas jawaban (menambahkan sebagai jawaban karena terlalu panjang untuk komentar). Di Julia Anda memiliki yang berikut ini:
sementara di Python:
dan Anda melihat bahwa angka ke-8 dalam Python adalah perkiraan yang tidak akurat
70/9
, sedangkan di Julia dalam kasus ini Anda mendapatkan urutan perkiraan terdekat untuk10*i/9
menggunakanFloat64
.Jadi sepertinya karena urutan asli berbeda Anda sisanya mengikuti apa yang @Jakob Nissen berkomentar.
Namun hal-hal tidak sesederhana itu. Sebagai
exp
fungsi dalam Julia dan Python sedikit berbeda dalam apa yang mereka hasilkan. Lihat Python:sementara di Julia:
(Anda dapat memeriksa bahwa keduanya
(20/3)^2
samaFloat64
dalam Julia dan Python).Jadi dalam hal ini dengan
exp
Python sedikit lebih akurat daripada Julia. Oleh karena itu bahkan memperbaikit
(yang mudah dengan menggunakan pemahaman dalam Python, bukanlinspace
) tidak akan membuat ACF menjadi sama.Kesimpulannya adalah apa yang dikomentari @Jakob Nissen untuk nilai sebesar itu, hasilnya akan sangat dipengaruhi oleh ketidakakuratan numerik.
sumber