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]
Alex A.
sumber

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.
Dennis
sumber
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)
mnel
sumber
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])
Cameron Aavik
sumber
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
Luis Mendo
sumber
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} *)
njpipeorgan
sumber
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 P.
sumber
@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.