Pour répondre à votre première question, numpy.correlate(a, v, mode)
effectue la convolution de a
avec l'inverse de v
et donne les résultats tronqués par le mode spécifié. La définition de la convolution, C(t)=∑ -∞ < i < ∞ aivt+i où -∞ < t < ∞, permet d'obtenir des résultats de -∞ à ∞, mais vous ne pouvez évidemment pas stocker un tableau de taille infinie. Il doit donc être tronqué, et c'est là que le mode intervient. Il existe 3 modes différents : complet (full), même (same) et valide (valid) :
- Le mode complet (full) renvoie des résultats pour chaque
t
où a
et v
se chevauchent.
- Le mode même (same) renvoie un résultat de même longueur que le vecteur le plus court (
a
ou v
).
- Le mode valide (valid) ne renvoie des résultats que lorsque
a
et v
se chevauchent complètement. La documentation pour numpy.convolve
fournit plus de détails sur les modes.
Pour votre deuxième question, je pense que numpy.correlate
vous donne en fait l'autocorrélation, mais vous donne un peu plus aussi. L'autocorrélation est utilisée pour déterminer à quel point un signal, ou une fonction, est similaire à lui-même à un certain retard. Pour un retard de 0, l'auto-corrélation devrait être la plus élevée car le signal est identique à lui-même, donc vous vous attendiez à ce que le premier élément du tableau de résultat d'autocorrélation soit le plus grand. Cependant, la corrélation ne commence pas à un retard de 0. Elle commence à un retard négatif, proche de 0, puis devient positive. Vous vous attendiez donc à :
autocorrélation(a) = ∑ -∞ < i < ∞ aivt+i où 0 <= t < ∞
Mais ce que vous avez obtenu était :
autocorrélation(a) = ∑ -∞ < i < ∞ aivt+i où -∞ < t < ∞
Vous devez prendre la dernière moitié de votre résultat de corrélation, et cela devrait être l'autocorrélation que vous recherchez. Une simple fonction Python pour cela serait :
def autocorr(x):
result = numpy.correlate(x, x, mode='full')
return result[result.size/2:]
Vous aurez bien sûr besoin de vérifier les erreurs pour vous assurer que x
est effectivement un tableau à une dimension. De plus, cette explication n'est probablement pas la plus rigoureuse sur le plan mathématique. J'ai parlé d'infinis car la définition de la convolution les utilise, mais cela ne s'applique pas nécessairement à l'autocorrélation. Ainsi, la partie théorique de cette explication peut être légèrement confuse, mais j'espère que les résultats pratiques vous seront utiles. Ces pages sur l'autocorrélation sont plutôt utiles et peuvent vous donner un arrière-plan théorique bien meilleur si vous ne vous souciez pas de vous plonger dans la notation et les concepts complexes.
0 votes
Voir aussi: stackoverflow.com/questions/12269834/… pour plus d'informations sur l'autocorrélation normalisée.