1. ホーム
  2. python

[解決済み] numpy.correlateを使って自己相関をするにはどうしたらいいですか?

2022-02-02 02:03:02

質問

数値の集合の自己相関をしたいのですが、私の理解では、集合とそれ自体の相関です。

私はnumpyのcorrelate関数を使ってそれを試してみましたが、私はその結果を信じていません。なぜなら、それはほとんど常に最初の数字であるベクトルを与えるからです。 ない ということです。

つまり、この質問は本当は2つの質問なんです。

  1. とは一体何なのでしょうか? numpy.correlate をしているのでしょうか?
  2. これを使って(あるいは他のものを使って)自己相関を行うにはどうしたらよいでしょうか?

どのように解決するのですか?

最初の質問にお答えします。 numpy.correlate(a, v, mode) の畳み込みを行っています。 a の逆で v で、指定したモードで切り取った結果を出力します。その コンボリューションの定義 , C(t)=Σ <サブ -∞ < i < ∞(イコール)。 a <サブ i v <サブ t+i ここで、-∞ < t < ∞は、-∞から∞までの結果を可能にしますが、無限に長い配列を格納することは当然できません。そこで、切り取る必要があるのですが、そこで登場するのがモードです。モードには、full、same、& validの3種類があります。

  • full"モードでは、すべての t ここで av は重なる部分があります。
  • "same"モードは、最短のベクトルと同じ長さの結果を返します( a または v ).
  • モードは、以下の場合にのみ結果を返します。 av は完全に重なり合っています。その ドキュメント に対して numpy.convolve は、モードに関するより詳細な情報を提供します。

2つ目の質問に対して、私は numpy.correlate は自己相関を与えてくれますが、それ以上のものも与えてくれます。自己相関は、ある信号や関数が、ある時間差で自分自身にどれだけ似ているかを見つけるために使われます。時間差が0のとき、信号はそれ自身と同一なので、自己相関は最も大きくなるはずで、自己相関の結果配列の最初の要素が最も大きくなると予想されましたね。ところが、相関は時間差0で始まるのではなく、時間差がマイナスから始まり、0に近づき、プラスになる。つまり、あなたの予想通りです。

autocorrelation(a) = ∑ (オートコリレーション) <サブ -∞ < i < ∞(イコール)。 a <サブ i v <サブ t+i ここで、0 <= t < ∞である。

しかし、得られたのは

autocorrelation(a) = ∑ (自己相関) <サブ -∞ < i < ∞(無限大 a <サブ i v <サブ t+i ここで、-∞ < t < ∞とする。

相関の結果の下半分を取れば、それが求めている自己相関になるはずです。これを行うための簡単なPython関数は以下の通りです。

def autocorr(x):
    result = numpy.correlate(x, x, mode='full')
    return result[result.size/2:]

もちろん、エラーチェックが必要なのは x は実際には1-d配列です。また、この説明はおそらく最も数学的に厳密なものではないでしょう。畳み込みの定義では無限大を使うので無限大をばらまいてきましたが、自己相関の場合は必ずしもそうではありません。このように、この説明の理論的な部分は少しおかしいかもしれませんが、実用的な結果が役に立つことを期待しています。 これらの ページ 自己相関についてはかなり有用で、表記や重い概念を気にしなければ、より良い理論的背景を得ることができます。