免费的自相关样本


11

考虑一维实值向量x,它表示随时间以相等间隔测量的某些过程的观测值。我们称x时间序列

ñ表示的长度XX分别表示的算术平均值X。的样品自协方差函数被定义为

自协方差

对于所有-n < h < n。这测量了在不同时间观察到的同一系列中两个点之间的线性相关性。

样品的自相关函数,或ACF,被定义为

自相关

这仅使用值x t + h来度量在时间t处系列x的线性可预测性,我们将其表示为x t

请注意,这些样本估计值与基于理论属性的单纯计算不匹配。即,将样品自相关函数等于Pearson相关系数Xħ -step滞后的X

任务

给定一个数组x和一个非负整数h,从滞后0开始打印或返回x的前h +1个滞后自相关。滞后自相关是与上式中的负输入相对应的滞后自相关。

您可以假设0 < h < n,其中nx的长度,并且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]

Answers:


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

背景:

基于原始acf内置的31字节解决方案

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)

这可能是我见过的最聪明的把戏。我不知道有人能做到这一点。我们正试图选择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:+)

编辑(2016年5月20日):从该语言的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 '16

1

八度,47 37字节

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

@Rainer您可以使用匿名函数保存一些字节(在这种情况下,我认为您可以跳过disp,因为您返回的是函数输出)
Luis

@LuisMendo你是对的。保存了10个字节,即使不计入disp
Rainer P.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.