Бесплатный образец автокорреляции

11

Рассмотрим одномерный действительный вектор x, который представляет наблюдения некоторого процесса, измеренного через равные промежутки времени. Мы называем й в временных рядах .

Пусть n обозначает длину x, а обозначает среднее арифметическое x . Образец автоковариационная функция определяется как

автоковариация

для всех - n < h < n . Это измеряет линейную зависимость между двумя точками на одном и том же ряду, наблюдаемую в разное время.

Образец автокорреляционная функция , или АКФ, определяется как

автокорреляция

Это измеряет линейную предсказуемость ряда x в момент времени t , который мы обозначим x t , используя только значение x t + h .

Обратите внимание, что эти выборочные оценки не соответствуют наивным расчетам, основанным на теоретических свойствах. То есть, функция автокорреляции образца не равняться коэффициенту корреляции Пирсона по й с ч -ступенен лагом х .

задача

Принимая во внимание массив х и неотрицательное целое число час , печать или возвращать первые ч +1 отставание автокорреляций х , начиная с запаздыванием 0. лаг автокорреляции являются те , которые соответствуют отрицательным входам в приведенных выше формулах.

Можно предположить, что 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 

Если мы хотим, чтобы корреляции отображались более чем в 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)
mnel
источник
Это, наверное, самый умный трюк, который я когда-либо видел. Я понятия не имел, что это можно сделать. Мы пытаемся выбрать 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 мая 2016 г.): начиная с версии 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} *)
njpipeorgan
источник
Я собирался опубликовать это до того, как мой интернет отключился ... Вы можете сохранить байт с помощью #2~CorrelationFunction~{#}&.
LegionMammal978
1

Октава, 47 37 байт

@(h,x)xcov(x,'coeff')(numel(x)+(0:h))
Райнер П.
источник
@Rainer Возможно, вы можете сохранить несколько байтов, используя анонимную функцию (и в этом случае я думаю, что вы можете пропустить disp, потому что вы возвращаете вывод функции)
Луис Мендо
@ LuisMendo Ты прав. Сохранено 10 байт, даже не считая disp.
Райнер П.