DTW距離行列を作成するコード
関数コードまず載せる.
解釈後にします
#DTWで2つ時系列距離を計算する関数 #入力は2つデバイスの時系列特徴量,出力は2つデバイスの距離 def dtw_1(s1,s2,ww): r, c = len(s1), len(s2) dist = np.zeros((r+ww+1,c+ww+1)) dist[0,1:] = float("inf") dist[1:,0] = float("inf") D = dist[1:,1:] DTW= dist[1:,1:] #ユークリッド距離行列D for i in range(r+ww): for j in range(c+ww): if i<r and j<c: D[i,j] = np.sqrt(sum((s1[i]-s2[j])**2)) elif i>r-1 and j<c: D[i,j] = np.sqrt(sum((s1[ww-1]-s2[j])**2)) elif i<r and j>c-1: D[i,j] = np.sqrt(sum((s1[i]-s2[ww-1])**2)) elif i>r-1 and j>c-1: D[i,j] = np.sqrt(sum((s1[ww-1]-s2[ww-1])**2)) #累積距離行列DTW for i in range(r+ww): for j in range(c+ww): if i-j<ww and j-i<ww: DTW[i,j] = min(dist[i,j]+DTW[i,j]*2,dist[i,j+1]+DTW[i,j],dist[i+1,j]+DTW[i,j]) return DTW[-1,-1] #全てデバイス間のDTW距離のマトリックスを生成する関数 #入力は25カテゴリ×24時間帯の特徴量(600次元) #出力は各デバイス間DTW距離尺度の行列 def dtw_matrix_1(feature,ww): F=np.array(feature) dtw_matrix = np.zeros((F.shape[0],F.shape[0])) for A in range(F.shape[0]): for B in range(F.shape[0]): dtw_matrix[A,B] = dtw_1(feature[A],feature[B],ww) return dtw_matrix