web-dev-qa-db-fra.com

Comprendre la convergence de NumPy

Lors du calcul d'une moyenne mobile simple, numpy.convolve Semble faire l'affaire.

Question: Comment s'effectue le calcul lorsque vous utilisez np.convolve(values, weights, 'valid')?

Lorsque la documentation mentionne convolution product is only given for points where the signals overlap completely, À quoi font référence les 2 signaux?

Si des explications peuvent inclure des exemples et des illustrations, cela sera extrêmement utile.

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

La convolution est un opérateur mathématique principalement utilisé dans le traitement du signal. Numpy utilise simplement cette nomenclature de traitement de signal pour la définir, d'où les références "signal". Un tableau numpy est un signal. La convolution de deux signaux est définie comme l'intégrale du premier signal, inversée , balayant ("convolution sur") le deuxième signal et multipliée (par produit scalaire) à chaque position de vecteurs superposés. Le premier signal est souvent appelé le noyau, surtout s’il s’agit d’une matrice 2D dans traitement de l’image ou des réseaux de neurones, et le l'inversion devient un mise en miroir en 2D (NON transposée). Cela peut être plus clairement compris avec les animations sur wikipedia .

Les convolutions ont plusieurs définitions en fonction du contexte. Certains commencent la convolution lorsque le chevauchement commence, alors que d'autres commencent lorsque le chevauchement n'est que partiel. Dans le cas du mode "valide" de numpy, le chevauchement est spécifié pour être toujours complet. On l'appelle "valide" puisque chaque valeur donnée dans le résultat est faite sans extrapolation de données.

Par exemple, si votre tableau X a une longueur de 2 et que votre tableau Y a une longueur de 4, la convolution de X sur Y en mode "valide" vous donnera un tableau de longueur 3.

Première étape, pour X = [4 3] et 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

Remarque: Si X n'était pas inversé, l'opération s'appellerait une corrélation croisée au lieu d'une convolution.

Deuxième étape:

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

Troisième étape:

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

Le résultat de la convolution pour le mode "valide" serait alors [7 23 35].

Si le chevauchement est spécifié en tant que point de données unique (comme dans le cas du mode "complet"), le résultat vous aurait donné un tableau de longueur 5. La première étape est la suivante:

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

Etc. Plus de modes d'extrapolation existent.

113
Soravux