시간 왜곡 편집 거리
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, :); 끝
레퍼런스
- ^ Marcus-Voß and Jeremie Zumer, pytwed. "Github repository". Retrieved 2020-09-11.
- ^ TraMineR. "Website on the servers of the Geneva University, CH". Retrieved 2016-09-11.
- Marteau, P.; F. (2009). "Time Warp Edit Distance with Stiffness Adjustment for Time Series Matching". IEEE Transactions on Pattern Analysis and Machine Intelligence. 31 (2): 306–318. arXiv:cs/0703033. doi:10.1109/TPAMI.2008.76. PMID 19110495.