時系列マッチングのための dtw の Python 実装 (2)

序章

前回の記事では dtw ライブラリの使い方を紹介しましたが、制限が多すぎて柔軟性に欠け、描画に不便なので、より複雑なライブラリ dtw-python を紹介します。R言語のdtwのPython版であり、基本的なAPIが対応しており、ポイントや制約、スライディングウィンドウのマッチングモードをカスタマイズできるのが特徴です。同時に、便利な描画と高速な計算 (C 言語のカーネル) も提供します。公式ドキュメントについては、ここをクリックしてください

今回は、2 つの時系列が前の記事の順序を引き続き選択します。

import numpy as np
from dtw import *
x=[2., 0., 1., 1., 2., 4., 2., 1., 2., 0.]
y=[1., 1., 2., 4., 2., 1., 2., 0.]

なお、このライブラリはデフォルトで浮動小数点数を使用するため、ここではfloat型で初期化しますが、int型の整数を使用すると、下図のように計算エラーが発生し、左上隅に1e18のy軸の割合が表示され、黒い線が長い平線になることが分かります
ここに画像の説明を挿入

それが int と float の問題であることがわかるまでに長い時間がかかりました。
次に、計算と描画について詳しく説明します。

ds = dtw(y, x,keep_internals=True, step_pattern=asymmetric)
ds.plot(type="twoway",offset=-2)

コードの最初の行は、dtw オブジェクトを生成するために計算され、その内容はオブジェクトの各属性を通じて取得できます。たとえば、ds. distance は計算された最短距離を表示し、ds.reference はテンプレート シーケンスの値を表示し、ds.query はクエリシーケンス値を表示し ds.index1ds.index2それぞれ各シーケンスの対​​応するシーケンスを表示します。ここでは詳細は説明しません。ここで知っておく必要があるのは、y がクエリ (クエリ) シーケンス、 x がテンプレート (テンプレート) シーケンス、そして y を x と照合することだけです。
括弧内のパラメーターをもう一度説明します。x と y は言うまでもなく、包括性のために他のパラメーターを追加します。

dtw.dtw(x, y=None, dist_method='euclidean', step_pattern='symmetric2', window_type=None, window_args={}, keep_internals=False, distance_only=False, open_end=False, open_begin=False)

dist_method は、使用する距離方法を定義します。デフォルトは、ユークリッド距離である「euclidean」です。
keep_internals=True は距離行列などを含む内部情報を保存します。通常は True に設定します。
step_pattern は点間のマッチングパターンを定義します。いくつかの種類があります。詳しくは公式 Web サイトを確認してください。
window_type はグローバル条件制約を示し、いくつかのモードがあります。公式 Web サイトも参照してください。
distance_onlyが True に設定されている場合、計算は高速化され、距離のみが計算され、マッチング関数は無視されます。
Open_end と open_begin は、無制限のマッチング、つまり完全な部分マッチングを示すために True に設定されます。デフォルトは、先頭と末尾に厳密に対応するグローバル マッチングです。
コードの 2 行目は描画コードで、type はグラフのモードを示します。一般に、twowaythreewayの2 つのモードがあります。詳細は以下で説明します。offset =-2は 2 つの線の間の分離度として理解でき、見やすくするために大きく設定できます。
上記のコードで生成された図は次のとおりです:
ここに画像の説明を挿入
この図では、先頭と末尾が厳密に一致していることがわかります。図の黒い線はクエリ シーケンスを表し、青線はテンプレート シーケンスを表し、点線は点の一致を表します。「非対称」(step_pattern) モードでは、先頭と末尾は一致していますが、中間のいくつかの点が無視されていることがわかります。一致するフォームの種類は何ですか。印刷して確認してみましょう。

print(asymmetric)
asymmetric.plot()

ここに画像の説明を挿入
ここに画像の説明を挿入
正直、私もよくわかりませんが、わからなくても、比べてみればいいですよね?

ds = dtw(y, x,keep_internals=True, step_pattern=symmetric1)
ds.plot(type="twoway",offset=-2)

step_pattern を symmetric1 に置き換えて、次のように図を描きます。
ここに画像の説明を挿入
今回は、図内の点が 1 対 1 に対応していることがわかり、symmetry1 のパターン図を確認します。

print(symmetric1)
symmetric1.plot()

ここに画像の説明を挿入
明らかに、このモードは以前の asy 非対称モード (上下左右の 3 方向がある) よりも柔軟であり、これがポイントを 1 対 1 にできる理由であるはずです。
同時に、別の写真を見てみましょう。

ds.plot(type="threeway",offset=-2)

ここに画像の説明を挿入
3wayモードで描画したグラフは前回の記事のグラフとよく似ており、2点目から縦軸が1つずつ一致していることがわかります。
非対称は全体的に一致させることができないため、部分的に一致させることはできますか? 実際、前に説明した open_end パラメータと open_begin パラメータを使用すると、それが可能です。

ds = dtw(y, x,keep_internals=True, step_pattern=asymmetric,open_begin=True,open_end=False)
ds.plot(type="twoway",offset=-2)

x 配列は実際には y 配列の先頭を除いた配列であるため、open_begin を True に設定すると、先頭の制限を解放して任意に先頭を一致させることができ、この場合は部分一致が完了していることがわかります
ここに画像の説明を挿入

要約する

この記事では dtw-python ライブラリの描画機能を中心に紹介します. ウィンドウの定義や距離関数の定義についてはまだ触れていないので, 読者の方がご自身で調べて補足していただければ幸いです. int 型の計算エラーという大きなバグを除けば比較的完成度の高いライブラリです. これまでのところ、dtw の探索は一時的に終了しており、読者はディスカッションのためにメッセージを残すことができます。

1.https://dynamictimewarping.github.io/py-api/html/api/dtw.dtw.html#dtw.dtw
2.https://dynamictimewarping.github.io/py-api/html/api/dtw.StepPattern.html#dtw.StepPattern
3.https://dynamictimewarping.github.io/
4.https://www.jstatsoft.org /article/view/v031i07

おすすめ

転載: blog.csdn.net/weixin_43945848/article/details/120826885