동적 시간 비틀림/동적 시간 신축
동적 시간 왜곡/동적 시간 스트레칭
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를 사용하는 실천편으로서 층별 분류를 실시해 보고 싶습니다.만약 무슨 핑계가 있으면 평론을 받을 수 있다면 좋겠다.
사정을 봐주다.
Reference
이 문제에 관하여(동적 시간 비틀림/동적 시간 신축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hcpmiyuki/items/251586526c5924f09aa3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)