시간 왜곡 편집 거리

Time Warp Edit Distance

TWED(Time Warp Edit Distance)는 시간 '탄성'이산 시계열 매칭에 대한 유사성(또는 유사성) 측정값입니다.다른 거리 측정(DTW(Dynamic Time Warping) 또는 LCS(Longest Common Successence Problem))와 비교하여 TWED는 메트릭입니다.계산 시간의 복잡도는 O 2 O이지만 특정 상황에서 코리더를 사용하여 검색 공간을 줄임으로써 대폭 줄일 수 있습니다.메모리 공간의 복잡도는 O O 수 있으며 2009년 P.-F.에 의해 처음 제안되었습니다.마르토.

정의.


반면에.



\ \ _ { \ , \



0 { a ' { 0 } ' { }

실장

Python 래퍼에 의한 C에서의 TWED 알고리즘의 실장은, 다음의 Web 사이트에서 입수할 수 있습니다.

TWED는 [1]에서 구할 수 있는 Time Series Successence Search Python 패키지(TSEARCH)에도 구현됩니다.

TWED의 R 구현은 상태 또는 이벤트의 시퀀스를 마이닝, 기술 및 시각화하기 위한 R 패키지인 TraMineR과 보다 일반적으로 이산적인 시퀀스 [2]데이터에 통합되었습니다.

또한 cuTWED는 G로 인해 개선된 알고리즘을 사용하는 TWED의 CUDA 가속 구현이다.라이트(2020년).이 메서드는 메모리 내에서 선형으로 대규모 병렬화됩니다.cuTWED는 CUDA C/C++로 작성되며 Python 바인딩과 함께 제공되며 Marteau의 레퍼런스 C 구현을 위한 Python 바인딩도 포함되어 있습니다.

파이썬

수입품 수치 ~하듯이 np   방어하다 DLP(A, B, p=2):     비용. = np.(np.(np.복근(A - B), p))     돌아가다 np.(비용., 1 / p)   방어하다 트위드(A, 시간 SA, B, 시간 절약, , _420da):     # [ distance , DP ]= TWED ( A , timeSA , B , timeSB , lamda , nu )     # 특정 시계열 A 및 B에 대한 시간 왜곡 편집 거리(TWED) 계산     #     # A : = 시계열 A (예: [10 2 30 4])     # timeSA : = 시계열 A의 타임스탬프(예: 1:4)     # B : = 시계열 B     # timeSB : = 시계열 B의 타임스탬프     # lamda : = 삭제 조작에 대한 패널티     # nu : = 탄성 파라미터 - nu > = 0 거리측정에 필요     # 레퍼런스:     # 마르토, P.; F. (2009)"Time Warp Edit Distance with Strongity Adjustment for Time Series Matching(시계열 매칭을 위한 강성 조정 포함)"     # 패턴 분석 및 머신 인텔리전스에 관한 IEEE 트랜잭션. 31 (2): 306~318. arXiv:cs/0703033     # http://people.irisa.fr/Pierre-Francois.Marteau/      # 입력 인수 확인     한다면 (A) != (시간 SA):         인쇄물("A의 길이가 동일하지 않습니다.SA")         돌아가다 없음., 없음.      한다면 (B) != (시간 절약):         인쇄물("B의 길이가 시간 길이와 같지 않습니다.SB")         돌아가다 없음., 없음.      한다면  < > 0:         인쇄물("nu는 음수입니다")         돌아가다 없음., 없음.      # 패딩 추가     A = np.배열([0] + 목록.(A))     시간 SA = np.배열([0] + 목록.(시간 SA))     B = np.배열([0] + 목록.(B))     시간 절약 = np.배열([0] + 목록.(시간 절약))      n = (A)     m = (B)     # 동적 프로그래밍     DP = np.제로((n, m))      # DP 매트릭스를 초기화하고 첫 번째 행과 열을 무한대로 설정합니다.     DP[0, :] = np.인피     DP[:, 0] = np.인피     DP[0, 0] = 0      # 최소 비용 계산     위해서 i  범위(1, n):         위해서 j  범위(1, m):             # 다양한 운용 비용 계산 및 절감             C = np.하나((3, 1)) * np.인피             A에서 삭제 수             C[0] = (                 DP[i - 1, j]                 + DLP(A[i - 1], A[i])                 +  * (시간 SA[i] - 시간 SA[i - 1])                 + _420da             )             B에서의 삭제 수             C[1] = (                 DP[i, j - 1]                 + DLP(B[j - 1], B[j])                 +  * (시간 절약[j] - 시간 절약[j - 1])                 + _420da             )             # 양쪽 시계열로 데이터 포인트 유지             C[2] = (                 DP[i - 1, j - 1]                 + DLP(A[i], B[j])                 + DLP(A[i - 1], B[j - 1])                 +  * (복근(시간 SA[i] - 시간 절약[j]) + 복근(시간 SA[i - 1] - 시간 절약[j - 1]))             )             # 최소한의 비용으로 운용을 선택하고 DP 매트릭스를 갱신             DP[i, j] = np.(C)     거리 = DP[n - 1, m - 1]     돌아가다 거리, DP 

가장 비용 효율이 높은 경로를 찾으려면 역추적:

방어하다 역추적(DP):     # [ best _ path ]= BACKTRACKING ( DP )     # 가장 비용 효율이 높은 경로 계산     # DP : = TWED 함수의 DP 매트릭스      x = np.모양.(DP)     i = x[0] - 1     j = x[1] - 1      # 경로의 인덱스는 반대 방향으로 저장됩니다.     # 경로 = np.ones((i + j, 2)) * np.inf;     best_path = []      스텝 = 0     하는 동안에 i != 0 또는 j != 0:         best_path.추가하다((i - 1, j - 1))          C = np.하나((3, 1)) * np.인피          # 양쪽 시계열로 데이터 포인트 유지         C[0] = DP[i - 1, j - 1]         A에서 삭제 수         C[1] = DP[i - 1, j]         B에서의 삭제 수         C[2] = DP[i, j - 1]          # 가장 저렴한 비용의 지표 찾기         idx = np.argmin(C)          한다면 idx == 0:             # 양쪽 시계열로 데이터 포인트 유지             i = i - 1             j = j - 1         엘리프 idx == 1:             A에서 삭제 수             i = i - 1             j = j         또 다른:             B에서의 삭제 수             i = i             j = j - 1         스텝 = 스텝 + 1      best_path.추가하다((i - 1, j - 1))      best_path.()     돌아가다 best_path[1:] 

매트랩

함수 [거리, DP] = twed(A, timeSA, B, timeSB, lambda, nu) % [거리, DP] = TWED(A, timeSA, B, timeSB, lambda, nu) % 시계열 A 및 시간 B대한 TWED(Time Warp 편집 거리 계산:SA : = 시계열 A의 타임스탬프 (예: 1:4) % B : = 시계열 B % timeSB : = 시계열 B % lambda : = 삭제 조작 % nu : = 거리 측정 %필요한 탄성 파라미터 - nu > = 0 타임 스탬프 % Code by : P.-F. Marteau - http://people.irisa.fr/Pierre-Francois.Marteau/ % 길이(A) ~= 길이(timeSA) 경고경우 인수의 입력 여부확인합니다.A의 길이가 시간 길이와 같지 않습니다.SA') 길이(B) ~= 길이(timeSB) 경고경우 반환 입니다.B의 길이가 시간의 길이가 같지 않습니다.SB') nu < 0 warning "nu is negative") 반환 종료 % 패딩 A = [0 A]; 시간SA = [0 시간]SA]; B = [0 B]; 시간SB = [0 시간]SB]; % 다이내믹 프로그래밍 DP = 0(길이(A), 길이(B); % DP 매트릭스를 초기화하고 첫 번째 행과 열무한대 DP(1, :) = inf; DP(1, 1) = 0; n = 길이(시간 SA); 계산 %NS C = 1(3, 1) * inf; A C(1)에서 % 삭제 = DP(i - 1, j) + DLP(A(i - 1), A(i) + nu *(timeSA(i) - timeSA(i - 1) + 람다, B C(2)에서의 % 삭제 = DP(i, j - 1) + DLP(B(j - 1, B(j)) + nu * (timeSB(j) - time)SB(j - 1) + 람다, %  시계열 C(3) = DP(i - 1, j - 1) + DLP(A(i), B(j) + DLP(A(i - 1) + ... nu * (abs(timeSA(i) - timeSB(j) + abs(timeSA(i - 1) - time)SB(j - 1); % 최소 비용으로 연산을 선택하고 DP 행렬 DP(i, j) = 최소(C); 종점 거리 = DP(n, m), % 유클리드 거리 함수 계산 함수 [비용] = DLP(A, B) 비용 = sqrt(sum(A - B) 종점 2); 2;

가장 비용 효율이 높은 경로를 찾으려면 역추적:

함수 [경로] = 역추적(DP) % [경로] = 역추적(DP) % TWED 함수 x = 크기(DP)의 가장 비용 효율적 경로 % DP : = DP 매트릭스 계산; i = x(1); j = x(2); 경로의 %는 반대 방향인 경로 2(i)저장됩니다. 1(3, 1) * inf; % 두 시계열 C(1) = DP(i - 1, j - 1)에서 데이터 포인트 유지; A C(2)에서 % 삭제 = DP(i - 1, j), B C(3)에서 % 삭제 = DP(i, j - 1) = 가장 낮은 ID대한 지수 찾기 [x] = j; 사례 3 % B i = i, j = j - 1; 단계 = 단계 + 1; 경로(단계, :) = [i j]; % 경로는 역방향으로 계산되었다. 경로 = 경로(1:스텝, :); 경로 = 경로(: - 1:1, :); 

레퍼런스

  1. ^ Marcus-Voß and Jeremie Zumer, pytwed. "Github repository". Retrieved 2020-09-11.
  2. ^ TraMineR. "Website on the servers of the Geneva University, CH". Retrieved 2016-09-11.