numpy.correlate を使用して自己相関を行うにはどうすればよいでしょうか? 質問する

numpy.correlate を使用して自己相関を行うにはどうすればよいでしょうか? 質問する

一連の数字の自己相関を計算する必要がありますが、これは私の理解では、単にそのセット自体の相関を計算することです。

私はNumPyの相関関数を使って試してみましたが、ほとんどの場合、最初の数字がない当然ながら、最大のものです。

つまり、この質問は実際には 2 つの質問です。

  1. 正確には何なのかnumpy.correlate何をしてるの?
  2. これを(または他の何か)使用して自己相関を行うにはどうすればよいですか?

ベストアンサー1

最初の質問に答えると、numpy.correlate(a, v, mode)の畳み込みをのa逆数で実行しv、指定されたモードで切り取られた結果を返すことです。畳み込みの定義C(t)=∑ -∞ < i < ∞ a i v t+i (-∞ < t < ∞) は、-∞ から ∞ までの結果を許可しますが、明らかに無限に長い配列を保存することはできません。そのため、切り取る必要があり、ここでモードが登場します。3 つの異なるモードがあります: 完全、同一、有効:

  • 「フル」モードでは、 と の両方が重複するすべての結果が返されtます。av
  • a「同じ」モードでは、最短のベクトル (または)と同じ長さの結果が返されますv
  • 「有効」モードではa、とがv完全に重なり合っている場合にのみ結果が返されます。ドキュメンテーションnumpy.convolveモードの詳細については、こちらをご覧ください。

2番目の質問については、numpy.correlate 自己相関を示すと同時に、もう少し情報も提供します。自己相関は、特定の時間差で信号または関数がそれ自体とどの程度類似しているかを調べるために使用されます。時間差が 0 の場合、信号はそれ自体と同一であるため、自己相関は最も高くなるはずです。したがって、自己相関結果配列の最初の要素が最大になると予想されます。ただし、相関は時間差 0 から始まるわけではありません。相関は負の時間差から始まり、0 に近づき、その後正になります。つまり、次のようになると予想されます。

自己相関(a) = ∑ -∞ < i < ∞ a i v t+iただし 0 <= t < ∞

しかし、あなたが得たものは次のとおりです:

自己相関(a) = ∑ -∞ < i < ∞ a i v t+iただし -∞ < t < ∞

必要なのは相関結果の最後の半分を取ることです。それがあなたが探している自己相関になるはずです。それを実行する簡単な Python 関数は次のようになります。

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

numpy が計算したものの後半部分だけが返されます。もちろん、x実際に 1 次元配列であることを確認するためにエラー チェックが必要になります。また、この説明はおそらく数学的に最も厳密なものではありません。畳み込みの定義では無限大が使用されるため、無限大を多用していますが、これは必ずしも自己相関には適用されません。したがって、この説明の理論的な部分は少し不正確かもしれませんが、実際の結果が役立つことを願っています。これら ページ自己相関に関するものは非常に役に立ち、表記法や難しい概念を理解するのが苦にならないのであれば、より優れた理論的背景を得ることができます。

おすすめ記事