DTAI 연구 그룹에서 사용되는 시계열 거리(예: 동적 시간 왜곡)용 라이브러리입니다. 라이브러리는 순수한 Python 구현과 C의 빠른 구현을 제공합니다. C 구현에는 Cython만 종속성으로 포함됩니다. Numpy 및 Pandas와 호환되며 불필요한 데이터 복사 작업을 방지하도록 구현되었습니다.
문서: http://dtaistance.readthedocs.io
예:
from dtaidistance import dtw
import numpy as np
s1 = np.array([0.0, 0, 1, 2, 1, 0, 1, 0, 0])
s2 = np.array([0.0, 1, 2, 0, 0, 0, 0, 0, 0])
d = dtw.distance_fast(s1, s2)
이 작품을 인용하면:
Wannes Meert, Kilian Hendrickx, Toon Van Craenendonck, Pieter Robberechts, Hendrik Blockeel 및 Jesse Davis.
DTAIDistance(버전 v2). 제노도.
http://doi.org/10.5281/zenodo.5901139
v2의 새로운 기능 :
int
대신 ssize_t
를 일관되게 사용하면 64비트 시스템에서 더 큰 데이터 구조를 허용하고 Numpy와 더 잘 호환됩니다.max_dist
인수는 PrunedDTW[7]에 대한 Silva 및 Batista의 작업과 유사한 것으로 밝혀졌습니다. 이제 도구 상자는 더 많은 부분 거리를 잘라내기 때문에 PrunedDTW와 동일한 버전을 구현합니다. 또한 Silva와 Batista가 제안한 대로 max_dist
유클리드 거리로 자동 설정하여 계산 속도를 높이기 위해 use_pruning
인수가 추가되었습니다(새로운 방법 ub_euclidean
사용 가능).dtaidistance.dtw_ndim
패키지의 다차원 시퀀스에 대한 C 라이브러리 지원. $ pip install dtaidistance
또는
$ conda install -c conda-forge dtaidistance
pip 설치에는 Numpy 호환 C 코드(Cython 사용)를 컴파일하기 위한 종속성으로 Numpy가 필요합니다. 그러나 이 종속성은 선택 사항이며 제거할 수 있습니다.
소스 코드는 github.com/wannesm/dtaidistance에서 확인할 수 있습니다.
컴파일하는 동안 문제가 발생하는 경우(예: C 기반 구현 또는 OpenMP를 사용할 수 없음) 추가 옵션에 대한 설명서를 참조하세요.
from dtaidistance import dtw
from dtaidistance import dtw_visualisation as dtwvis
import numpy as np
s1 = np.array([0., 0, 1, 2, 1, 0, 1, 0, 0, 2, 1, 0, 0])
s2 = np.array([0., 1, 2, 3, 1, 0, 0, 0, 2, 1, 0, 0, 0])
path = dtw.warping_path(s1, s2)
dtwvis.plot_warping(s1, s2, path, filename="warp.png")
두 개의 숫자 시퀀스를 기반으로 한 거리 측정만 가능합니다.
from dtaidistance import dtw
s1 = [0, 0, 1, 2, 1, 0, 1, 0, 0]
s2 = [0, 1, 2, 0, 0, 0, 0, 0, 0]
distance = dtw.distance(s1, s2)
print(distance)
가장 빠른 버전(30-300회)은 c를 직접 사용하지만 입력으로 배열이 필요하며(double 유형 사용) (선택적으로) max_dist
유클리드 상한으로 설정하여 계산을 정리합니다.
from dtaidistance import dtw
import array
s1 = array.array('d',[0, 0, 1, 2, 1, 0, 1, 0, 0])
s2 = array.array('d',[0, 1, 2, 0, 0, 0, 0, 0, 0])
d = dtw.distance_fast(s1, s2, use_pruning=True)
또는 numpy 배열(dtype double 또는 float 포함)을 사용할 수 있습니다.
from dtaidistance import dtw
import numpy as np
s1 = np.array([0, 0, 1, 2, 1, 0, 1, 0, 0], dtype=np.double)
s2 = np.array([0.0, 1, 2, 0, 0, 0, 0, 0, 0])
d = dtw.distance_fast(s1, s2, use_pruning=True)
사용 가능한 인수에 대한 정보는 __doc__
를 확인하세요.
print(dtw.distance.__doc__)
동적 프로그래밍 알고리즘이 탐색하는 일부 경로를 조기에 중지하거나 거리 측정 계산을 조정하기 위한 다양한 옵션이 예상됩니다.
window
: 두 대각선에서 이 정도까지만 이동을 허용합니다.max_dist
: 반환된 거리 측정값이 이 값보다 커지면 중지합니다.max_step
: 이 값보다 큰 단계를 허용하지 않습니다.max_length_diff
: 두 계열의 길이 차이가 더 크면 무한대를 반환합니다.penalty
: 압축 또는 확장이 적용되는 경우 추가되는 페널티(거리에 더해).psi
: 시퀀스의 시작 및/또는 끝을 무시하기 위한 Psi 완화(원통형 시퀀스의 경우) [2].use_pruning
: 유클리드 상한을 기준으로 계산을 정리합니다. 거리 옆에 가능한 모든 뒤틀림 경로를 표시하기 위해 전체 행렬을 원하는 경우:
from dtaidistance import dtw
s1 = [0, 0, 1, 2, 1, 0, 1, 0, 0]
s2 = [0, 1, 2, 0, 0, 0, 0, 0, 0]
distance, paths = dtw.warping_paths(s1, s2)
print(distance)
print(paths)
모든 워핑 경로가 포함된 행렬은 다음과 같이 시각화할 수 있습니다.
from dtaidistance import dtw
from dtaidistance import dtw_visualisation as dtwvis
import random
import numpy as np
x = np.arange(0, 20, .5)
s1 = np.sin(x)
s2 = np.sin(x - 1)
random.seed(1)
for idx in range(len(s2)):
if random.random() < 0.05:
s2[idx] += (random.random() - 0.5) / 2
d, paths = dtw.warping_paths(s1, s2, window=25, psi=2)
best_path = dtw.best_path(paths)
dtwvis.plot_warpingpaths(s1, s2, paths, best_path)
시작과 끝에서 일치를 완화하는 psi
매개변수에 주목하세요. 이 예에서는 사인파가 약간 이동하더라도 완벽하게 일치합니다.
시퀀스 목록의 모든 시퀀스 간 DTW 거리 측정값을 계산하려면 dtw.distance_matrix
메서드를 사용하세요. C 코드( use_c
및 use_nogil
)와 병렬 또는 직렬 실행( parallel
)을 사용하도록 변수를 설정할 수 있습니다.
distance_matrix
메소드는 목록/배열 목록을 기대합니다:
from dtaidistance import dtw
import numpy as np
series = [
np.array([0, 0, 1, 2, 1, 0, 1, 0, 0], dtype=np.double),
np.array([0.0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0]),
np.array([0.0, 0, 1, 2, 1, 0, 0, 0])]
ds = dtw.distance_matrix_fast(series)
또는 행렬(모든 계열의 길이가 동일한 경우):
from dtaidistance import dtw
import numpy as np
series = np.matrix([
[0.0, 0, 1, 2, 1, 0, 1, 0, 0],
[0.0, 1, 2, 0, 0, 0, 0, 0, 0],
[0.0, 0, 1, 2, 1, 0, 0, 0, 0]])
ds = dtw.distance_matrix_fast(series)
거리 측정 행렬의 일부만 채우도록 계산을 지시할 수 있습니다. 예를 들어 계산을 여러 노드에 분산하거나 소스 계열과 대상 계열만 비교합니다.
from dtaidistance import dtw
import numpy as np
series = np.matrix([
[0., 0, 1, 2, 1, 0, 1, 0, 0],
[0., 1, 2, 0, 0, 0, 0, 0, 0],
[1., 2, 0, 0, 0, 0, 0, 1, 1],
[0., 0, 1, 2, 1, 0, 1, 0, 0],
[0., 1, 2, 0, 0, 0, 0, 0, 0],
[1., 2, 0, 0, 0, 0, 0, 1, 1]])
ds = dtw.distance_matrix_fast(series, block=((1, 4), (3, 5)))
이 경우의 출력은 다음과 같습니다:
# 0 1 2 3 4 5
[[ inf inf inf inf inf inf] # 0
[ inf inf inf 1.4142 0.0000 inf] # 1
[ inf inf inf 2.2360 1.7320 inf] # 2
[ inf inf inf inf 1.4142 inf] # 3
[ inf inf inf inf inf inf] # 4
[ inf inf inf inf inf inf]] # 5
시계열 클러스터링에는 거리 행렬을 사용할 수 있습니다. scipy.cluster.hierarchy.linkage
와 같은 기존 방법이나 포함된 두 가지 클러스터링 방법 중 하나를 사용할 수 있습니다(후자는 SciPy 연결 방법의 래퍼입니다).
from dtaidistance import clustering
# Custom Hierarchical clustering
model1 = clustering.Hierarchical(dtw.distance_matrix_fast, {})
cluster_idx = model1.fit(series)
# Augment Hierarchical object to keep track of the full tree
model2 = clustering.HierarchicalTree(model1)
cluster_idx = model2.fit(series)
# SciPy linkage clustering
model3 = clustering.LinkageTree(dtw.distance_matrix_fast, {})
cluster_idx = model3.fit(series)
전체 클러스터링 트리( HierarchicalTree
또는 LinkageTree
)를 추적하는 모델의 경우 트리를 시각화할 수 있습니다.
model.plot("myplot.png")
선택 과목:
개발:
DTAI distance code.
Copyright 2016-2022 KU Leuven, DTAI Research Group
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.