概要
Shape-based Distance (SBD) は、2つの時系列データの類似性を評価するための指標の1つ。
時間方向・振幅方向のシフトを許容して形状を比較することが可能。
計算方法
前処理段階で2つの時系列データ $R={r_1,r_2,\cdots,r_T},\ S={s_1,s_2,\cdots,s_T}$ は標準化されているものとする:
\[E(r_i) = E(s_j) = 0,\ V(r_i) = E(s_j) = 1\]ここで $E$ は期待値、$V$ は分散を表す。
時系列データ $R$ と、$S$ に時間ステップのシフト $\tau = 0,1,2,\cdots,T-1$ を施したものとの相関係数 $NCC(\tau)$ を計算する:
\[NCC(\tau) := \cfrac{ \sum_{i=1}^T r_i s_{i+\tau} }{ \sqrt{\sum_{i=1}^T r_i^2} \sqrt{\sum_{i=1}^T s_{i+\tau}^2} }\]ここで、$r_i,s_j$ はともに標準化されている想定のため、相関係数の計算式には平均値が出てこない。
この中で、最も $NCC(\tau)$ の値が大きくなるような $\tau$ を $\tau^*$ とすると、shape-based distance $SBD(R,S)$ は以下の式で計算される。
\[SBD(R, S) = 1-NCC(\tau^*)\]実装・動作確認
import numpy as np
def sbd(r, s, report=False):
T = len(r)
r_norm = (r - r.mean()) / r.std()
s_norm = (s - s.mean()) / s.std()
ncc_max = -np.inf
tau_best = 0
for tau in range(T):
s_shift = np.concatenate([s[T-tau:], s[:T-tau]])
ncc = np.corrcoef(r_norm, s_shift)[0,1]
if ncc_max < ncc:
ncc_max = ncc
tau_best = tau
ret = 1 - ncc_max
if report:
plt.title(r'$SBD = {:.4f}, \tau^* = {}$'.format(ret, tau_best))
plt.plot(r, label=r'$R(t)$')
plt.plot(s, label=r'$S(t)$')
plt.plot(np.concatenate([s[T-tau_best:], s[:T-tau_best]]), label=r'$S(t-\tau^*)$')
plt.grid()
plt.legend()
plt.show()
return ret
T = 100
t = np.linspace(0, np.pi*4, T)
x0 = np.sin(t) + np.random.rand(T)*0.4-0.2
x1a = np.sin(t-np.pi/4) + np.random.rand(T)*0.4-0.2
x1b = np.sin(t-np.pi/2) + np.random.rand(T)*0.4-0.2
x2a = np.sin(t) + 1.0 + np.random.rand(T)*0.4-0.2
x2b = np.sin(t) + 2.0 + np.random.rand(T)*0.4-0.2
x3a = np.sin(0.8*t) + np.random.rand(T)*0.4-0.2
x3b = np.sin(1.2*t) + np.random.rand(T)*0.4-0.2
x4a = 0.5*np.sin(t) + np.random.rand(T)*0.4-0.2
x4b = 2.0*np.sin(t) + np.random.rand(T)*0.4-0.2
sbd(x0, x1a, True)
sbd(x0, x1b, True)
sbd(x0, x2a, True)
sbd(x0, x2b, True)
sbd(x0, x3a, True)
sbd(x0, x3b, True)
sbd(x0, x4a, True)
sbd(x0, x4b, True)
操作 | 例1 | 例2 | SBD | 考察 |
---|---|---|---|---|
平行移動(時間方向) | 小 | 最適な時間シフト $\tau^*$ 選択の効果 | ||
平行移動(振幅方向) | 小 | 標準化の効果 | ||
拡大・縮小(時間方向) | 大 | 時間シフトや標準化では違いを吸収できない | ||
拡大・縮小(振幅方向) | 小 | 標準化の効果 |