파이썬 대 줄리아 자기 상관


19

Julia를 사용하여 자기 상관을 수행하고 그것을 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

파이썬 코드

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])

1
두 경우 모두에서 테스트 데이터를 인쇄하십시오
Mad Physicist

답변:


26

당신 test_data이 다르기 때문 입니다.

파이썬 :

array([ 0.84147098, -0.29102733,  0.96323736,  0.75441021, -0.37291918,
        0.85600145,  0.89676529, -0.34006519, -0.75811102, -0.99910501])

줄리아 :

[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가치는 떨어질 것입니다.

실제로 초기 배열의 기본 이진 값을 검사 할 수 있습니다 t. 예를 들어 마지막 세 번째 값이 다릅니다.

줄리아 :

julia> reinterpret(Int, range(0, stop=10, length=10)[end-2])
4620443017702830535

파이썬 :

>>> import struct
>>> s = struct.pack('>d', np.linspace(0,10,10)[-3])
>>> struct.unpack('>q', s)[0]
4620443017702830536

우리는 그들이 정확히 하나의 머신 엡실론에 동의하지 않는 것을 볼 수 있습니다. 그리고 Julia를 사용하면 sinPython에서 얻은 가치를 가져 옵니다.

julia> sin(exp(reinterpret(Float64, 4620443017702830536)^2))
-0.3400651855865199

우리는 파이썬과 같은 가치를 얻습니다.


9

답변을 조금만 확장하면됩니다 (댓글이 너무 길어서 답변으로 추가). Julia에는 다음이 있습니다.

julia> t = collect(range(0, stop=10, length=10))
10-element Array{Float64,1}:
  0.0               
  1.1111111111111112
  2.2222222222222223
  3.3333333333333335
  4.444444444444445 
  5.555555555555555 
  6.666666666666667 
  7.777777777777778 
  8.88888888888889  
 10.0               

julia> t .- [10*i / 9 for i in 0:9]
10-element Array{Float64,1}:
 0.0
 0.0
 0.0
 0.0
 0.0
 0.0
 0.0
 0.0
 0.0
 0.0

파이썬에서 :

>>> t = np.linspace(0,10,10)
>>> t - [10*i/9 for i in range(10)]
array([0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
       0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 8.8817842e-16,
       0.0000000e+00, 0.0000000e+00])

파이썬에서 8 번째 숫자는 부정확 한 근사치 70/9이지만 Julia에서는을 10*i/9사용 하는 가장 가까운 근사치 시퀀스를 얻습니다 Float64.

따라서 원래 순서가 다르기 때문에 나머지는 @Jakob Nissen이 언급 한 내용을 따릅니다.

그러나 일이 그렇게 간단하지 않습니다. 으로 exp줄리아와 파이썬에서 함수는 그들이 생산 것에 조금 다르다. 파이썬 참조 :

>>> from math import exp
>>> from mpmath import mp
>>> mp.dps = 1000
>>> float(mp.exp((20/3)**2) - exp((20/3)**2))
-1957.096392544307

줄리아에있는 동안 :

julia> setprecision(1000)
1000

julia> Float64(exp(big((20/3)^2)) - exp((20/3)^2))
2138.903607455693

julia> Float64(exp(big((20/3)^2)) - nextfloat(exp((20/3)^2)))
-1957.096392544307

( Julia와 Python에서 (20/3)^2동일한 것을 확인할 수 있습니다 Float64).

따라서이 경우 expPython의 경우 Julia보다 약간 더 정확합니다. 따라서 고정 t(. 대신 Python에서 이해를 사용하여 쉽게 수행) 조차도 linspaceACF가 같지 않습니다.

결론적으로 @Jakob Nissen은 그러한 큰 가치에 대해 그 결과가 수치 부정확성에 의해 크게 영향을받을 것이라고 언급했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.