ตัวอย่าง Autocorrelation ฟรี


11

พิจารณาเวกเตอร์x 1 มิติมูลค่าจริงที่แสดงถึงการสังเกตของกระบวนการบางอย่างที่วัดที่ระยะห่างเท่า ๆ กันเมื่อเวลาผ่านไป เราเรียกxอนุกรมเวลา

ให้nหมายถึงความยาวของxและxแสดงว่าค่าเฉลี่ยเลขคณิตของx ฟังก์ชันกำหนดค่าตัวอย่างอัตโนมัติถูกกำหนดให้เป็น

autocovariance

สำหรับทุก - n < ชั่วโมง < n วิธีนี้เป็นการวัดการพึ่งพาเชิงเส้นตรงระหว่างสองจุดในชุดเดียวกันที่สังเกตในเวลาที่ต่างกัน

ตัวอย่างอัตฟังก์ชั่นหรือ ACF ถูกกำหนดให้เป็น

อัต

สิ่งนี้วัดความสามารถในการทำนายเชิงเส้นของอนุกรมxณ เวลาtซึ่งเราแสดงว่าx tโดยใช้ค่าx t + hเท่านั้น

โปรดทราบว่าการประมาณการตัวอย่างเหล่านี้ไม่ตรงกับการคำนวณแบบไร้เดียงสาตามคุณสมบัติทางทฤษฎี นั่นคือฟังก์ชั่นอัตตัวอย่างไม่เท่ากับค่าสัมประสิทธิ์สหสัมพันธ์เพียร์สันของxกับเอช -step ล่าช้าของx

งาน

รับอาร์เรย์xและจำนวนเต็ม nonnegative hพิมพ์หรือส่งกลับค่าความสัมพันธ์อัตโนมัติh +1 lagแรกของxเริ่มต้นด้วย lag 0 ความสัมพันธ์แบบอัตโนมัติ lag เป็นค่าที่สอดคล้องกับอินพุตเชิงลบในสูตรด้านบน

คุณสามารถสันนิษฐานได้ว่า 0 < h < nโดยที่nคือความยาวของxและ 2 < n <256

เอาต์พุตควรถูกต้องภายใน 1E-4 ไม่มีข้อ จำกัด ในการใช้งานฟังก์ชั่นในตัวหรือเวลาทำงาน

ตัวอย่าง

h, x -> output
--------------
5, [2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2] -> [1.00000000,  0.07659298, -0.06007802, -0.51144343, -0.02912874, -0.10468140]
1, [2134, 1863, 1877, 1877, 1492, 1249] -> [1.0000000, 0.3343041]
2, [13067.3, 13130.5, 13198.4] -> [1.0000000000, -0.0002854906, -0.4997145094]

คำตอบ:


4

เยลลี่26 25 24 23 20 ไบต์

×L_SµḊ;0µƓС׹S€µF÷Ḣ

ลองออนไลน์!

มันทำงานอย่างไร

×L_SµḊ;0µƓС׹S€µF÷Ḣ  Main link. Input: x (list) STDIN: h (integer)

×L                    Multiply all items in x by the length of x.
  _S                  Subtract the sum of x from all products.
                      Let's call the result X.
    µ                 Begin a new monadic chain. Argument: t (list)
     Ḋ                Remove the first element of t.
      ;0              Append a 0 to the result.
        µ             Push the previous chain and begin a new one.
                      Argument: X
         Ɠ            Read h from STDIN.
          С          Repeat the Ḋ;0 chain h times, collecting the h+1 intermediate
                      results in a list A.
            ×¹        Multiply the vectors in A by X.
              S€      Compute the sum of each vectorized product.
                µ     Begin a new, monadic chain. Argument: S (sums)
                 F    Flatten S. This does nothing except creating a deep copy.
                   Ḣ  Pop the first element of S.
                  ÷   Divide all elements of the copy by the first element.

6

R, 3 31 25 ไบต์

# changes the builtin to only return the acf
body(acf)=body(acf)[1:18]

การใช้งาน (คืนค่าอาเรย์ด้วยค่าความสัมพันธ์อัตโนมัติ)

(acf(c(2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2),5))
# , , 1
#
#             [,1]
# [1,]  1.00000000
# [2,]  0.07659298
# [3,] -0.06007802
# [4,] -0.51144343
# [5,] -0.02912874
# [6,] -0.10468140

พื้นหลัง:

โซลูชัน 31 ไบต์ขึ้นอยู่กับต้นฉบับacfในตัว

function(n,h)c(acf(n,h,,F)$acf)

โปรดทราบว่าตัวเลือก 3 ไบต์ acfเป็นรูปแบบดั้งเดิมที่จะทำการพล็อต (และพิมพ์เป็น 3 หลัก) ในขณะที่ส่งคืนค่าความสัมพันธ์อัตโนมัติที่ต้องการเป็นองค์ประกอบในรายการ

การใช้

 acf(c(2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2),5)

เอาท์พุท:

#    Autocorrelations of series ‘c(2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2)’, by lag
#
#     0      1      2      3      4      5 
# 1.000  0.077 -0.060 -0.511 -0.029 -0.105 

ถ้าเราต้องการให้ correlations แสดงมากกว่าทศนิยม 3 ตำแหน่งแล้ว 28 ไบต์จะทำ (หรือ 31 ถ้าเราต้องการที่จะระงับพล็อต)

# will still plot (28 bytes)
function(n,h)c(acf(n,h)$acf)
# won't plot (31 bytes)
function(n,h)c(acf(n,h,,F)$acf)

นี่อาจเป็นเคล็ดลับที่ฉลาดที่สุดที่ฉันเคยเห็น ฉันไม่รู้ว่าจะทำอย่างนั้นได้ เรากำลังพยายามเลือก R ให้เป็นภาษาของเดือนคุณสามารถโหวตได้เมตาคำตอบนี้เพื่อให้มันเกิดขึ้น
JayCe

3

Python 3, 147 130 126 120 ไบต์

def p(h,x):x=[t-sum(x)/len(x)for t in x];return[sum(s*t for s,t in zip(x[n:],x))/sum(b*b for b in x)for n in range(h+1)]

ทางออกนี้น่าจะไปตีกอล์ฟต่อไปมันเป็นเพียงการเริ่มต้น

คุณสามารถโทรหาด้วย:

p(5,[2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2])

2

MATL , 20 ไบต์

tYm-tPX+tX>/GnqiQ:+)

แก้ไข (20 พฤษภาคม 2559): ใช้ภาษาเวอร์ชัน 18.0.0 Y+X+แทน ลิงค์นี้มีการเปลี่ยนแปลง

ลองออนไลน์!

ความสัมพันธ์มีความสัมพันธ์อย่างใกล้ชิดกับการโน้มน้าวใจ เราทำให้เป็นมาตรฐานโดยการลบค่าเฉลี่ยแล้วปรับกลับเป็นปกติอีกครั้งโดยหารด้วยค่าสูงสุดแล้วเลือกค่าที่ต้องการ

tYm-       % implicit input. Duplicate and subtract mean
tPX+       % duplicate, flip, convolve
tX>/       % duplicate, divide by maximum value
Gnq        % length of array, n. Subtract 1
iQ:        % input number h. Generate vector [1,2,...,h+1]
+          % add to obtain vector [n,n+1,...,n+h]
)          % use that vector as an index. Implicitly display

1

Mathematica ขนาด 27 ไบต์

ขอบคุณ LegionMammal978 สำหรับการบันทึก 1 ไบต์

เราสามารถเอาชนะ Jelly ได้ถ้าชื่อฟังก์ชั่นนั้นไม่นาน

#2~CorrelationFunction~{#}&

กรณีทดสอบ

%[5,{2.4,2.4,2.4,2.2,2.1,1.5,2.3,2.3,2.5,2}]
(* {1.,0.076593,-0.060078,-0.511443,-0.0291287,-0.104681} *)

ผมกำลังจะโพสต์นี้ก่อนที่อินเทอร์เน็ตของฉันลงไป ... #2~CorrelationFunction~{#}&คุณสามารถบันทึกไบต์ด้วย
LegionMammal978

1

Octave, 47 37 bytes

@(h,x)xcov(x,'coeff')(numel(x)+(0:h))

@Rainer คุณสามารถบันทึกไม่กี่ไบต์โดยใช้ฟังก์ชั่นที่ไม่ระบุชื่อ (และในกรณีนี้ฉันคิดว่าคุณสามารถข้ามdispไปได้เพราะคุณคืนค่าเอาต์พุตของฟังก์ชั่น)
Luis Mendo

@LuisMendo คุณพูดถูก ที่บันทึกไว้ 10 dispไบต์ได้โดยไม่ต้องนับ
Rainer P.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.