동적 시간 비틀림/동적 시간 신축

최근에 시간 서열 분석을 공부하면서 시간 서열 간의 유사도를 측정할 때 DTW라는 방법을 배웠기 때문에 천천히 정리하고 싶습니다.이번에는 설명편, 다음을 실천편으로 삼고 싶습니다.

동적 시간 왜곡/동적 시간 스트레칭


DTW는 시간 시퀀스 데이터 간의 유사도를 측정하는 데 사용됩니다.나는 파형의 유사도를 구하는 방법은 유클리드 거리와 여현 거리 등이 있다고 생각한다.
DTW는 두 시간 서열의 각 점의 거리(오차의 절대값)를 구하고, 모두 구한 후에 두 시간 서열의 가장 짧은 경로를 찾습니다.
대응하는 점을 선택할 때 중복을 허용하기 때문에 시간 서열 사이의 길이와 주기가 다르더라도 유사도를 구할 수 있다.
따라서 DTW는'주기에서 벗어났지만 모양이 비슷한'경우나 시리즈 간 길이가 다른 데이터의 유사도를 측정하고 싶을 때 다른 방법보다 편리한 방법이라고 할 수 있다.

라이브러리에서 시도


jupyter notebook에서 실행하고 프레젠테이션을 하려고 합니다.
Python에는 DTW를 위한 라이브러리가 몇 개 있는데, 이번에는'fastdtw'를 사용합니다.패스트인 것 같아서요.
각 점이 총계로 계산된다는 점에서 DTW는 계산량이 상당히 필요한 방법이라는 것을 알아차렸을 것입니다.실제로 집합 등에서 사용한다면 더 많은 계산량이 필요하니 힘내세요.여기 사이트의 계산 시뮬레이션은 매우 이해하기 쉽다.
우선 fatsdtw를 설치합니다.
!pip install fastdtw
그리고 필요한 모듈을 호출합니다.
from fastdtw import fastdtw
import matplotlib.pyplot as plt
# グラフを横長固定(お好みで)
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 10, 6
프레젠테이션 데이터 만들기
# データ作成
from numpy.random import *

seed(100)
rand()

a = list(randint(0, 20, 30))
# bはaを少しだけずらしたデータにする
b = [0, 1, 10, 4] + a

plt.plot(a, label="a")
plt.plot(b, label="b")
plt.legend()
plt.show()

프레젠테이션 데이터는 DTW의 장점을 이해하기 위해 비슷하고 길이가 다른 데이터를 사용하지만 어떤 데이터도 문제없다.
그러면 우리는 실제로 DTW로 싱크로율을 계산한다
distance, path = fastdtw(a, b)
distance

# 出力
37.0
그것만으로는 잘 알려지지 않았기 때문에 각 점이 어떻게 대응하는지 설명할 것이다.
fastdtw는 계산된 거리와 함께 선택한 경로를 원조로 되돌려주기 때문에 사용합니다.
plt.plot(a, label="a")
plt.plot(b, label="b")

# もっといい書き方あれば知りたい
for a_x, b_x in path:
  plt.plot([a_x, b_x], [a[a_x], b[b_x]], color='gray', linestyle='dotted', linewidth=1)

plt.legend()
plt.show()


같은 모양의 부분이 대응하는 경로임을 알 수 있다.이렇게 위상 오프셋은 실제로 DTW를 사용하여 유사한 데이터를 나타내고 직관적인 유사도를 나타낼 수 있다.

끝내다


끝까지 읽어줘서 고마워요.
다음에는 DTW를 사용하는 실천편으로서 층별 분류를 실시해 보고 싶습니다.만약 무슨 핑계가 있으면 평론을 받을 수 있다면 좋겠다.
사정을 봐주다.

좋은 웹페이지 즐겨찾기