質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6521閲覧

DTWを実装する方法

wpspring0300

総合スコア11

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/17 07:47

DTWをpythonで実装しようと思い、コードを書いてみたのですがエラーが出てしまい、理由がわからないので教えていただきたいです。

python

1def dtw(vec1, vec2): #vec1とvec2は長さの異なる整数型配列 2 import numpy as np 3 d = np.zeros([len(vec1)+1, len(vec2)+1]) 4 d[:] = np.inf 5 d[0, 0] = 0 6 for i in range(1, d.shape[0]): 7 for j in range(1, d.shape[1]): 8 cost = abs(vec1[i-1]-vec2[j-1]) 9 d[i, j] = cost + min(d[i-1, j], 10 d[i, j-1], 11 d[i-1, j-1]) 12 return d[-1][-1] 13 print(d) 14import pandas as pd 15import numpy as np 16 17df = pd.read_csv('20070701_TMN0002_1s.csv_m.csv') 18df1 = pd.read_csv('20070701_TMN0069_1s.csv_m.csv') 19df2 = pd.DataFrame() 20df3 = pd.DataFrame() 21df = df.groupby(df.index // 60).mean() 22df1 = df1.groupby(df1.index // 30).mean() 23for i in range (23): 24 i += 1 25 df2.loc[i,0] = i 26 df2.loc[i,1] = df.iloc[i,1] + df.iloc[i,2] 27for i in range(47): 28 df3.loc[i,0] = i 29 df3.loc[i,1] = df1.iloc[i,1] + df1.iloc[i,2] 30print(df3) 31dtw(df2,df3)

print(df3)はきちんと表示がされます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DTW の実装部分は正しいです。
なので問題があるとすれば、そこに渡してるデータを作っている以下の部分です。
csv ファイルがないので、こちらでは具体的になにが問題かはわかりません。

python

1df = pd.read_csv('20070701_TMN0002_1s.csv_m.csv') 2df1 = pd.read_csv('20070701_TMN0069_1s.csv_m.csv') 3df2 = pd.DataFrame() 4df3 = pd.DataFrame() 5df = df.groupby(df.index // 60).mean() 6df1 = df1.groupby(df1.index // 30).mean() 7for i in range (23): 8 i += 1 9 df2.loc[i,0] = i 10 df2.loc[i,1] = df.iloc[i,1] + df.iloc[i,2] 11for i in range(47): 12 df3.loc[i,0] = i 13 df3.loc[i,1] = df1.iloc[i,1] + df1.iloc[i,2] 14print(df3) 15dtw(df2,df3)

試したコード

python

1import matplotlib.pyplot as plt 2import numpy as np 3import seaborn as sn 4 5def draw_heatmap(mat): 6 plt.figure(figsize=(6, 6)) 7 ax = sn.heatmap(mat, annot=True, cmap='Reds') 8 plt.show() 9 10x = np.array([1, 1, 2, 3, 2, 0], dtype=float) 11y = np.array([0, 1, 1, 2, 5, 2, 1], dtype=float)

イメージ説明

python

1def dtw(x, y): 2 # 距離行列を作成する。 3 X, Y = np.meshgrid(x, y) 4 dist = np.sqrt((X - Y) ** 2) # ユークリッド距離 5 draw_heatmap(dist) 6 7 # 番兵として 0行、0列目を inf で埋めている。 8 dtw = np.full((len(y) + 1, len(x) + 1), np.inf) 9 dtw[0, 0] = 0 10 11 for i in range(1, len(y) + 1): 12 for j in range(1, len(x) + 1): 13 dtw[i, j] = min( 14 dtw[i - 1, j], 15 dtw[i, j - 1], 16 dtw[i - 1, j - 1]) + dist[i - 1, j - 1] 17 draw_heatmap(dtw[1:, 1:]) 18 19 return dtw[-1, -1]

距離行列
イメージ説明

累積したコスト行列
イメージ説明

fstdtw ライブラリで計算した値と同じになることも確認できました。

python

1print('DTW: ', dtw(x, y)) # 4.0 2from fastdtw import fastdtw 3print('fastdtw', fastdtw(x, y)[0]) # 4.0

投稿2018/09/21 09:52

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wpspring0300

2018/09/21 14:39

ありがとうございました。 データ自体に不備があったため、修正したら出来ました。 ご丁寧な回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問