前提
pythonで相互相関関数を計算するために、numpyのcorrelateを使って二つの関数の時系列的なズレを計算しようとしています。
「時系列データのタイムラグを検知したい!!(相互相関関数)」https://qiita.com/katsuki104/items/d0d2a38efb91557e031c を参考にして計算をしました。
この記事では、np.correlateを使う際には、関数の平均を0にする必要があるとのことです。
ガウス関数のような山の形をしたもの同士の時系列のズレを計算しようとしたのですが、ガウス関数の平均を0とした場合としない場合で計算結果が異なってしまいました。
また、用意した関数のずれと対応した結果となったのは、平均を0としない場合でした。
この違いとなる原因、もしくは、この山形の場合はどちらの結果が正しいと言えるのか教えていただけませんでしょうか?
ちなみに、ノイズのような関数同士の計算では、平均を0にしないとうまくいかないことは確認済みです。
該当のソースコード
Python
1import numpy as np 2import matplotlib.pyplot as plt 3import random 4 5num = 0.01 6low = -10 7high = 5 8sigma1 = 1 9sigma2 = 1 10 11#ガウス関数を二つ用意、理論的には'5'のずれが検出されるはず 12x1 = np.arange(low,high,num) 13y1 = [] 14for i in range(len(x1)): 15 y1.append(np.exp(-x1[i]**2 / 2*(sigma1 **2)) * (1+random.uniform(-0.1,0.1))) 16 17x2 = np.arange(low,high,num) 18y2 = [] 19for i in range(len(x2)): 20 y2.append(np.exp(-(x2[i]+5)**2 / 2*(sigma2 **2)) * (1+random.uniform(-0.1,0.1))) 21 22#平均を0にする操作 23#y1 = [y1[l] - np.mean(y1) for l in range(len(y1))] 24#y2 = [y2[l] - np.mean(y2) for l in range(len(y2))] 25 26#二つのガウス関数のズレを相互相関関数で計算 27corr = np.correlate(y1, y2, "full") 28print(corr.tolist().index(max(corr))) 29estimated_delay = (corr.argmax() - (len(y2) - 1)) * num 30print("estimated delay is " + str(estimated_delay)) 31 32plt.plot(x1,y1,color='red') 33plt.plot(x2,y2,color='blue') 34 35plt.show() 36
補足情報(FW/ツールのバージョンなど)
python 3.7.9
numpy 1.12.5
pythonのコードの一番最初の行のすぐ上に
```python
だけの行を追加してください
また、pythonのコードの一番最後の行のすぐ下に
```
だけの行を追加してください
または、
https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif
を見て、そのようにしてみてください
現状、コードがとても読み辛いです
質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
ありがとうございます。
コード部分に追加いたしました。
