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

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

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

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

2回答

4882閲覧

DTWアルゴリズムの実装について

keng

総合スコア32

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

1クリップ

投稿2016/11/04 08:45

DTW(Dynamic Time Warping)の実装についての質問なのですが、以下の実装例を自分で解釈していたのですが

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]

まずpythonの文法としてnp.infが何をしているのかが疑問です。d[:]には何が入っているのでしょうか
次にアルゴリズムについて単にcostの中身をd[i,j]に入れればいいのではと思ったのですがmin()を行うことの意味がよくわかりません。
どなたかご教授願えればと思います。
http://sinhrks.hatenablog.com/entry/2014/11/14/232603
https://en.wikipedia.org/wiki/Dynamic_time_warping 英Wiki
などを参考にしています。

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

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

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

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

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

guest

回答2

0

まずpythonの文法としてnp.infが何をしているのかが疑問です。d[:]には何が入っているのでしょうか

d = np.array([1,2,3])
d[:] = np.inf
で確かめてみましょう。

次にアルゴリズムについて単にcostの中身をd[i,j]に入れればいいのではと思ったのですがmin()を行うことの意味がよくわかりません。

DTWについて。
始点と終点をつなぐ経路のうち、累積コストが最小なパスを見つけているだけです。
5x5マスくらいの単純な例を作って手計算をしてみれば何をしているのかすぐ理解できるはずです。

投稿2016/11/04 14:18

WathMorks

総合スコア1582

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

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

0

ベストアンサー

np.inf は Numpy で定義された値で infinity の略です。
d[:] = np.inf も Numpy のイデオムで、行列 d の要素を全て np.inf で埋める初期化処理です。

min の中では 左・上・左上の中から小さいものを選んでいます。
左、上の添字は -1 ですが、負の値の添字は言語・実装により様々。
Pythonでも末端からの要素と、意図しない要素を参照してしまう為、境界チェックが必要になります。

そこで len(vec1) x len(vec2) に対して +1 のサイズの行列を準備して、
初期化の際に上・左の端を inf で埋めて、左上を 0 とすることで、
境界チェックのコードを省けるように工夫しています。

このような inf の使われ方についてですが、アルゴリズムに置いては 番兵と呼ばれ、
inf に限らず実際のデータ中には現れない値が、境界を表す値として仮置きされます。

| 0 | inf | inf | inf |
| inf | ... | ... | ... |
| inf | ... | ... | ... |

i=1, j=1 の時に min に渡す 左・上・左上の値は (inf, inf, 0)

numpy のコードでは、全ての要素を inf で埋めて、左上の 0 を入れていますが、
Wiki の実装が想定する初期化後の行列は上記のような感じです。
ここで ... と表記した部分のデータは左上から順に埋まっていく為、
未定義のまま参照されることはないので、この時点ではなんでも構いません。

[Pure Python で書いて可視化してみました](http://pythontutor.com/live.html#code=vec1%20%3D%20%5B1,%202,%203%5D%0Avec2%20%3D%20%5B2,%204,%206,%208%5D%0An,%20m%20%3D%20len(vec1%29%2B1,%20len(vec2%29%2B1%0A%0Ainf%20%3D%209999%0A%0Adtw%20%3D%20%5B%5Binf%5D%20*%20m%20for%20_%20in%20range(n%29%5D%0A%0Adtw%5B0%5D%5B0%5D%20%3D%200%0A%0Afor%20i%20in%20range(1,%20n%29%3A%0A%20%20%20%20for%20j%20in%20range(1,%20m%29%3A%0A%20%20%20%20%20%20%20%20cost%20%3D%20abs(vec1%5Bi-1%5D%20-%20vec2%5Bj-1%5D%29%0A%20%20%20%20%20%20%20%20dtw%5Bi%5D%5Bj%5D%20%3D%20cost%20%2B%20min(dtw%5Bi-1%5D%5Bj%5D,%20dtw%5Bi%5D%5Bj-1%5D,%20dtw%5Bi-1%5D%5Bj-1%5D%29%0A%20%20%20%20%20%20%20%20%0Aresult%20%3D%20dtw%5B-1%5D%5B-1%5D&cumulative=false&curInstr=57&heapPrimitives=false&mode=display&origin=opt-live.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false)

First を押した後 Foward を連打してステップ実行してみて下さい。
ここでは、inf は 仮に 適当なとにかく大きな値としています。

投稿2016/11/04 13:55

teamikl

総合スコア8664

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

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

keng

2016/11/04 17:04 編集

詳細な回答ありがとうございます 追記:python tutorすごいですね!大変勉強になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問