Un campione gratuito di autocorrelazione


11

Si consideri un vettore monodimensionale e con valori reali x che rappresenta le osservazioni di alcuni processi misurati ad intervalli equamente spaziati nel tempo. Chiamiamo x una serie temporale .

Lasciate n indicare la lunghezza del x e x denotano la media aritmetica di x . La funzione di autocovarianza di esempio è definita come

autocovarianza

per tutto - n < h < n . Questo misura la dipendenza lineare tra due punti sulla stessa serie osservata in momenti diversi.

La funzione di autocorrelazione del campione , o ACF, è definita come

autocorrelazione

Questo misura la prevedibilità lineare della serie x al tempo t , che denotiamo x t , usando solo il valore x t + h .

Si noti che queste stime di esempio non corrispondono ai calcoli ingenui basati sulle proprietà teoriche. Cioè, la funzione di autocorrelazione del campione non è uguale al coefficiente di correlazione di Pearson di x con il ritardo h- passo di x .

Compito

Dato un array xe un intero non negativo h , stampa o restituisce le prime autocorrelazioni del ritardo h +1 di x , a partire dal ritardo 0. Le autocorrelazioni del ritardo sono quelle corrispondenti agli input negativi nelle formule precedenti.

Puoi supporre che 0 < h < n , dove n è la lunghezza di x , e che 2 < n <256.

L'output deve essere corretto entro 1E-4. Non ci sono restrizioni sull'uso delle funzioni integrate o sul tempo di esecuzione.

Esempi

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]

Risposte:


4

Gelatina, 26 25 24 23 20 byte

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

Provalo online!

Come funziona

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

Utilizzo (restituisce un array con le autocorrelazioni)

(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

Sfondo:

La soluzione a 31 byte basata sull'originale acfincorporato

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

Si noti che l'opzione a 3 byte acfè l'originale incorporato che verrà tracciato (e stampato su 3 cifre) restituendo al contempo l'autocorrelazione richiesta come elemento in un elenco.

uso

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

produzione:

#    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 

Se vogliamo che le correlazioni vengano visualizzate con più di 3 cifre decimali, lo faranno 28 byte (o 31, se vogliamo sopprimere la trama)

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

Questo è probabilmente il trucco più intelligente che abbia mai visto. Non avevo idea che si potesse farlo. Stiamo cercando di selezionare R come Lingua del mese: puoi votare questa meta risposta per realizzarla.
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)]

Questa soluzione verrà probabilmente ulteriormente approfondita, è solo un inizio.

Puoi chiamarlo con:

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 maggio 2016): dalla versione 18.0.0 della lingua, utilizzare Y+invece di X+. Il collegamento include questa modifica.

Provalo online!

La correlazione è strettamente correlata alla convoluzione. Si normalizza sottraendo media, quindi si contorce, si normalizza nuovamente dividendo per valore massimo, quindi si selezionano i ritardi desiderati.

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

Grazie a LegionMammal978 per aver salvato 1 byte.

Potremmo battere Jelly se i nomi delle funzioni non fossero così lunghi.

#2~CorrelationFunction~{#}&

Caso di prova

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

Stavo per postare questo prima che la mia Internet non funzionasse ... Puoi salvare un byte con #2~CorrelationFunction~{#}&.
LegionMammal978,

1

Ottava, 47 37 byte

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

@Rainer Puoi forse salvare qualche byte usando una funzione anonima (e in quel caso penso che puoi saltare disp, perché stai tornando all'output di una funzione)
Luis Mendo,

@LuisMendo Hai ragione. 10 byte salvati, anche senza contare il disp.
Rainer P.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.