Sampel Gratis Autokorelasi


11

Pertimbangkan vektor 1-dimensi, bernilai riil x yang mewakili pengamatan beberapa proses yang diukur pada interval dengan jarak yang sama dari waktu ke waktu. Kita sebut x a time series .

Misalkan n menunjukkan panjang x dan menunjukkan rata-rata aritmatika dari x . The sampel autokovarian fungsi didefinisikan sebagai

autokovarian

untuk semua - n < h < n . Ini mengukur ketergantungan linear antara dua titik pada seri yang sama yang diamati pada waktu yang berbeda.

The sampel autokorelasi fungsi , atau ACF, didefinisikan sebagai

autokorelasi

Ini mengukur prediktabilitas linear dari seri x pada waktu t , yang kita nyatakan x t , hanya menggunakan nilai x t + h .

Perhatikan bahwa taksiran sampel ini tidak cocok dengan perhitungan naif berdasarkan pada properti teoretis. Artinya, fungsi autokorelasi sampel tidak sama dengan Pearson koefisien korelasi dari x dengan h -Langkah tertinggal dari x .

Tugas

Mengingat array x dan bilangan bulat positif h , mencetak atau mengembalikan pertama h 1 lag autocorrelations dari x , dimulai dengan lag 0. autocorrelations lag adalah mereka sesuai dengan input negatif dalam rumus di atas.

Anda dapat mengasumsikan bahwa 0 < h < n , di mana n adalah panjang x , dan 2 < n <256.

Output harus benar dalam 1E-4. Tidak ada batasan dalam penggunaan fungsi bawaan atau waktu berjalan.

Contohnya

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]

Jawaban:


4

Jelly, 26 25 24 23 20 byte

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

Cobalah online!

Bagaimana itu bekerja

×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 byte

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

Penggunaan (mengembalikan array dengan autokorelasi)

(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

Latar Belakang:

Solusi 31 byte berdasarkan pada perangkat bawaan acfbawaan

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

Perhatikan bahwa opsi 3 byte acfadalah yang asli dibuat di yang akan memplot (dan mencetak hingga 3 digit) sambil mengembalikan autokorelasi yang diperlukan sebagai elemen dalam daftar.

pemakaian

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

keluaran:

#    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 

Jika kita ingin korelasi ditampilkan ke lebih dari 3 tempat desimal maka 28 byte akan melakukannya (atau 31, jika kita ingin menekan plot)

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

Ini mungkin trik paling pintar yang pernah saya lihat. Saya tidak tahu ada yang bisa melakukan itu. Kami mencoba agar R dipilih sebagai Bahasa Bulan Ini - Anda dapat mengunggah jawaban meta ini untuk mewujudkannya.
JayCe

3

Python 3, 147 130 126 120 byte

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

Solusi ini mungkin akan golf lebih lanjut, Ini baru permulaan.

Anda dapat menyebutnya dengan:

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

2

MATL , 20 byte

tYm-tPX+tX>/GnqiQ:+)

EDIT (20 Mei 2016): pada versi 18.0.0 bahasa, gunakan Y+sebagai ganti X+. Tautan ini menyertakan perubahan ini.

Cobalah online!

Korelasi terkait erat dengan konvolusi. Kami menormalkan dengan mengurangi rata-rata, kemudian berbelit-belit, menormalkan kembali dengan membagi dengan nilai maksimum, dan kemudian memilih jeda yang diinginkan.

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 byte

Terima kasih kepada LegionMammal978 untuk menghemat 1 byte.

Kita bisa mengalahkan Jelly jika nama fungsi tidak terlalu panjang.

#2~CorrelationFunction~{#}&

Kasus cobaan

%[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} *)

Saya akan memposting ini sebelum Internet saya turun ... Anda dapat menyimpan byte dengan #2~CorrelationFunction~{#}&.
LegionMammal978

1

Oktaf, 47 37 byte

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

@Rainer Anda mungkin dapat menyimpan beberapa byte menggunakan fungsi anonim (dan dalam hal ini saya pikir Anda dapat melewatkan disp, karena Anda kembali ke output fungsi)
Luis Mendo

@LuisMendo Anda benar. Disimpan 10 byte, bahkan tanpa menghitung disp.
Rainer P.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.