web-dev-qa-db-ja.com

NumPyのコンボルブを理解する

単純な移動平均を計算するとき、_numpy.convolve_は仕事をするように見えます。

質問:np.convolve(values, weights, 'valid')を使用すると、どのように計算が行われますか?

ドキュメントが_convolution product is only given for points where the signals overlap completely_に言及したとき、2つのシグナルは何を参照していますか?

説明に例や図を含めることができる場合、非常に役立ちます。

_window = 10
weights = np.repeat(1.0, window)/window
smas = np.convolve(values, weights, 'valid')
_
58
Nyxynyx

畳み込みは、主に信号処理で使用される数学演算子です。 Numpyは単にこの信号処理の命名法を使用して定義するため、「信号」参照になります。 numpyの配列はシグナルです。 2つの信号の畳み込みは、最初の信号の積分reversedとして定義され、2番目の信号を掃引(「畳み込み」)して乗算(重複するベクトルの各位置でのスカラー積)。最初の信号は、多くの場合kernelと呼ばれ、特に 画像処理 またはニューラルネットワークの2次元行列であり、reversal2-Dのミラーリング (転置ではない)になります。 wikipediaのアニメーション を使用すると、より明確に理解できます。

畳み込みには、コンテキストに応じて複数の定義があります。オーバーラップが始まるときに畳み込みを開始するものもあれば、オーバーラップが部分的であるときに開始するものもあります。 numpyの「有効」モードの場合、オーバーラップは常に完全になるように指定されています。結果で与えられるすべての値はデータの外挿なしで行われるため、「有効」と呼ばれます。

たとえば、配列Xの長さが2で、配列Yの長さが4の場合、「有効」モードでXをYに畳み込むと、長さ3の配列が得られます。

最初のステップ、X = [4 3]およびY = [1 1 5 5]

[3 4]                   (X is reversed from [4 3] to [3 4], see note)
[1 1 5 5]
= 3 * 1 + 4 * 1 = 7

注:Xが反転されていない場合、演算は畳み込みではなく 相互相関 と呼ばれます。

第二段階:

  [3 4]
[1 1 5 5]
= 3 * 1 + 4 * 5 = 23

第三のステップ:

    [3 4]
[1 1 5 5]
= 3 * 5 + 4 * 5 = 35

モード「有効」の畳み込みの結果は[7 23 35]になります。

オーバーラップが単一のデータポイントとして指定されている場合(モード "full"の場合)、結果は長さ5の配列になります。最初のステップは次のとおりです。

[3 4]
  [1 1 5 5]
= 3 * undefined (extrapolated as 0) + 4 * 1 = 4

等々。より多くの外挿モードが存在します。

113
Soravux