前回までの変化検知実験では理想的なデータを使っていたが、実際にはノイズが入る。前回の実験で変化検知していたのは、地の部分の信号の位相の変化だった。それではどれくらいのノイズが載ったら変化検知ができなくなるのだろう。
一連のテストデータでは、地の部分に p-p 0.02の正弦波がある。ここに、乱数でホワイトノイズの載せて変化度への影響を見る数値実験を試す。
まず、ノイズのない状態がこれ
地の部分に対して、48%のノイズを載せた結果は、こうなる。変化点と同じだけの変化度がノイズで生まれてしまって、変化検知ができていない。
ちなみに、このときのノイズ交じりのソースデータはこのとおり。目視では地の正弦波がしっかり見えてはいるのだが。
<pre>
import numpy as np
import matplotlib.pyplot as plt
import math
def normV(v):
return v / np.linalg.norm(v,2)
n_amp = 0.01 * 0.1
bg_amp = 0.01
pat_len = 3000
pat = np.empty(3600)
for i in range (5):
if (i<2):
offset = 720*i
else :
offset = 720*i - 321
for p in range (720):
pat[offset+p] = (math.exp(-p/60)+bg_amp) * (1-math.cos(math.pi * p / 60)) + n_amp *(2*np.random.rand()-1)
M = 50
n = M // 2
k = M // 2
L = k // 2
r = 3
m = 2
a = np.zeros(pat_len)
for i in range (pat_len-L-k-M):
X = np.empty((M,0))
for j in range(n):
X = np.hstack((X, np.array([normV(pat[i+j:i+j+M])]).T) )
U,Sx,Vx = np.linalg.svd(X, full_matrices=True)
Z = np.empty((M,0))
for j in range(k):
Z = np.hstack((Z, np.array([normV(pat[i+L+j:i+L+j+M])]).T) )
Q,Sz,Vz = np.linalg.svd(Z, full_matrices=True)
UQ = np.dot(U.T[0:r,:], Q.T[0:m,:].T)
a[i+L+k+M-2]=1-np.linalg.norm(UQ,2)
print (n_amp, n_amp / 0.01)
plt.plot(a[:pat_len])
</pre>
[1] 井出 剛、杉山 将, 異常検知と変化検知, 講談社, 2017 ISBN978-4-06-152908-3