自己相関の無料サンプル


11

時間とともに等間隔の間隔で測定されたプロセスの観測を表す1次元の実数値のベクトルxを考えます。x時系列と呼びます。

ましょNの長さを表し、X及びXの意味算術平均Xを試料の自己共分散関数は、のように定義されます

自己共分散

すべて-n < h < nの場合。これは、異なる時間に観測された同じシリーズの2つのポイント間の線形依存性を測定します。

サンプル自己相関関数、またはACFは、のように定義されます

自己相関

これは、値x t + hのみを使用して、x tを表す時間tでの系列xの線形予測可能性を測定します。

これらのサンプル推定値は、理論的特性に基づく単純な計算と一致しないことに注意してください。すなわち、試料の自己相関関数は、ないに等しいピアソン相関係数X時間の遅れ〜ステップ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]

回答:


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バイト

1バイトを節約してくれたLegionMammal978に感謝します。

関数名がそれほど長くなければ、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

1

オクターブ、47 37バイト

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

@Rainer無名関数を使用して数バイトを保存できます(その場合disp、関数出力を返すのでスキップできると思います)
ルイスメンドー

@LuisMendoそのとおりです。をカウントしなくても、10バイトを節約しましたdisp
レイナーP.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.