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