DTW(Dynamic Time Warping)은 동적 시간 워핑이라고 불린다.
두개의 시계열 데이터가 서로 얼마나 유사한지 비교할 때 사용한다.
DTW를 사용하는 이유?
- 두개의 시계열 데이터 길이가 달라도 유사도 비교 가능
- 비슷한 패턴이지만 시간차가 있는 경우(shift 발생) 유사도 비교 가능
DTW 계산방법 이론
공식으로 보는 방법도 있는데 예시를 들어서 계산하는게 더 이해가 잘 된다.
이론적인 설명 이후에 예시를 들어서 직접 계산해보도록 하자.
시계열 데이터 2개가 있다.
두 시계열의 길이 n, m은 길이가 같을 수도 있고 다를 수도 있다.
이 두개의 시계열을 나열하여 n x m 행렬을 만든다.
유클리드거리를 이용하여 최적의 와핑 경로를 탐색한다.
와핑경로는 두개의 시계열 데이터 P와 Q 사이의 맵핑을 나타내는 와핑 거리의 집합이며, 연속적이여야한다.
- boundary conditions : 와핑집합의 첫번째와 마지막은 이어져야한다.
- continuity : 와핑경로는 대각 요소를 포함한 인접한 셀로 제한된다.
- monotonicity : 와핑경로는 음의 방향으로 이동하지 않는다.
이 세가지 조건을 만족하는 셀들 중 와핑거리합이 최소가 되는 경로를 찾으면 된다.
와핑거리의 합은 와핑경로비용 이라고 부르기도 한다.
와핑경로는 위와 같은 공식으로 찾으면 되는데 미지수들로 이루어져 있어 보기 힘들다면 실제 계산으로 쉽게 이해할 수 있다.
DTW 계산방법 실습코드
DTW를 사용할 수 있는 패키지는 dtaidistance와 dtw-python 이 있다.
내가 dtw-python 계산식을 못찾아서 적용을 못해봤다.
같은 데이터이지만 distance 값이 다르게 나와서 내가 계산식을 이해한 dtaidistance 패키지를 사용했다.
# 패키지 설치
# pip install dtaidistance
import numpy as np
import pandas as pd
from dtaidistance import dtw
데이터 만들기
실습에 사용할 데이터가 있다면 불러오기를 해도 되고, 없다면 간단하게 리스트로 만들어도 된다.
a = [1, 2, 5, 7, 4, 3, 6, 8, 2, 1]
b = [3, 6, 1, 2, 8, 9, 3, 4, 3, 2, 1, 2]
c = [2, 5, 7, 4, 3, 6, 8, 2, 1, 1]
a가 빨간선, b가 노란선, c가 보라색 선이다.
a와 b는 길이가 다르고
a와 c는 패턴을 비슷하지만 시간차가 있다.
행렬만들기
먼저 a, b에 대한 행렬을 만들어 준다.
계산식 = (a1 - b1)의 제곱 + min(인접셀 3개)
> (1, 1) 자리 계산
(1, 1) 자리에는 첫번째 요소들의 차의 제곱값을 적어준다.
(a의 첫번째 요소인 1 - b의 첫번째 요소인 3)의 제곱 = 4
> 행, 열 첫번째 줄
(1, 2) 부터는 이전 셀 + 두번째요소들의 차 로 계산해서 넣어주면 된다.
(1, 2)
=(1, 1)의 값 4 + (a의 두번째 요소 2 - b의 첫번째 요소 3)의 제곱
= 4 + 1
= 5
(1, 3)
= (1, 2) 의 값 5 + (a의 세번째 요소 5 - b의 첫번째 요소 3)의 제곱
= 5 + 4
= 9
이런식으로 한줄씩 채워가면 되고, 세로줄의 경우도 마찬가지로 계산해주면 된다.
(2, 1)
= (1, 1) 의 값 4 + (a의 첫번재 요소 1 - b의 두번째 요소 6)의 제곱
= 4 + 25
= 29
> 행, 열 두번째줄 이상
(2, 2)부터는 인접한 셀 값들 중 가장 작은 값을 사용한다.
(2, 2)를 감싸고 있는 인접한 셀은 (1, 1)=4, (1, 2)=5, (2, 1)=29이다.
(2, 2)
= (a의 두번째 요소 2 - b의 두번째 요소 6)의 제곱 + 인접셀 중 가장 작은 값
= 16 + 4
= 20
(2, 3)
= (a의 세번째 요소 5 - b의 두번재 요소 6)의 제곱 + 인접셀 중 가장 작은 값 5
= 1 + 5
= 6
최적의 와핑 경로 찾기
최적의 와핑경로는 마지막 셀에서 작은 숫자로 역추적 하는 방법을 사용한다.
최종 와핑 경로 비용 DTW
와핑경로비용은 마지막 값에 루트를 씌운 값이다.
DTW
= sqrt(28)
= 5.29...
from dtaidistance import dtw
a = [1, 2, 5, 7, 4, 3, 6, 8, 2, 1]
b = [3, 6, 1, 2, 8, 9, 3, 4, 3, 2, 1, 2]
distance = dtw.distance(a, b)
print(distance)
>> 5.291502622129181
동일하게 5.29가 나오는 것을 확인할 수 있다.
distance 값이 작을수록 기준이 되는 a값과 유사도가 높다고 분석한다.
from dtaidistance import dtw_visualisation as dtwvis
dtwvis.plot_warping(a, b, path = dtw.warping_path(a, b))
a와 c를 DTW를 구해보자
a와 c의 경우 시간차이만 있을 뿐 패턴은 비슷하게 진행된다.
이를 유클리드 거리로 측정할 경우 시간차이가 있기 때문에 그리 유사하다고 나오지는 않는데
DTW의 경우에는 이 시간인덱스를 감안해서 계산하기 때문에 distance가 1이 나왔다.
from dtaidistance import dtw
a = [1, 2, 5, 7, 4, 3, 6, 8, 2, 1]
c = [2, 5, 7, 4, 3, 6, 8, 2, 1, 1]
distance = dtw.distance(a, c)
print(distance)
>> 1.0
from dtaidistance import dtw_visualisation as dtwvis
dtwvis.plot_warping(a, b, path = dtw.warping_path(a, b))
DTW 분류
실제 데이터를 가지고 분석을 해본 결과다
위 표와 같이 DTW 거리에 따른 분류 및 차이를 확인할 수 있다.
참고
https://syj9700.tistory.com/58
'ML&DL > Project' 카테고리의 다른 글
[토이프로젝트] 환자정보와 기침소리를 이용한 코로나 감염여부 판단 모델 (정형데이터 + 오디오 멀티모달 실습 코드, 머신러닝 딥러닝 프로젝트 주제) (0) | 2023.05.25 |
---|---|
여러가지 방법으로 이상치탐지 수행 (iforest, fbprophet, ADTK) (0) | 2023.04.05 |
yolov5 환경에서 yolov4 모델 학습 및 예측 해보기 (0) | 2022.03.14 |
[object detection] 이미지 라벨링, 폴리곤 작업후 (CVAT, json) 시각화(yolov5, convert2Yolo) 실습 코드 (2) | 2022.03.11 |
진동센서 데이터 푸리에 변환과 하모닉을 이용한 고장 유형 분류 모델 (0) | 2021.12.22 |