我正在尝试使用 Julia 进行自相关并将其与 Python 的结果进行比较。他们为什么给出不同的结果?
Julia 代码
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:
array([ 0.84147098, -0.29102733, 0.96323736, 0.75441021, -0.37291918,
0.85600145, 0.89676529, -0.34006519, -0.75811102, -0.99910501])
Julia :
[0.8414709848078965, -0.2910273263243299, 0.963237364649543, 0.7544102058854344,
-0.3729191776326039, 0.8560014512776061, 0.9841238290665676, 0.1665709194875013,
-0.7581110212957692, -0.9991050130774393]
发生这种情况是因为您正在服用
sin
庞大的数字。例如,t
中的最后一个数字10 岁,exp(10^2)
是〜2.7 * 10 ^ 43。在这种规模下,浮点不准确度约为 3*10^9。因此,即使 Python 和 Julia 的最低有效位也不同,sin
值(value)将遥遥无期。事实上,我们可以检查初始数组
t
的底层二进制值。 .例如,它们在倒数第三个值上有所不同:Julia :
julia> reinterpret(Int, range(0, stop=10, length=10)[end-2])
4620443017702830535
Python:
>>> import struct
>>> s = struct.pack('>d', np.linspace(0,10,10)[-3])
>>> struct.unpack('>q', s)[0]
4620443017702830536
我们确实可以看到他们完全不同意一台机器 epsilon。如果我们使用 Julia 取
sin
Python获取的值:julia> sin(exp(reinterpret(Float64, 4620443017702830536)^2))
-0.3400651855865199
我们得到与 Python 相同的值。
关于Python 与 Julia 自相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60378705/