DTAI 研究小組使用的時間序列距離庫(例如動態時間規則)。該函式庫提供純 Python 實作和 C 快速實作。它與 Numpy 和 Pandas 相容,並且可以避免不必要的資料複製操作。
文件:http://dtaidistance.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 中的新功能:
ssize_t
而不是int
允許在 64 位元機器上使用更大的資料結構,並且與 Numpy 更相容。max_dist
參數與 Silva 和 Batista 在 PrunedDTW [7] 上的工作類似。該工具箱現在實現了與 PrunedDTW 相同的版本,因為它修剪了更多的部分距離。此外,根據 Silva 和 Batista 的建議,添加了use_pruning
參數來自動將max_dist
設定為歐幾里德距離,以加快計算速度(可以使用新方法ub_euclidean
)。dtaidistance.dtw_ndim
套件中的多維序列。 $ pip install dtaidistance
或者
$ conda install -c conda-forge dtaidistance
pip 安裝需要 Numpy 作為依賴項來編譯與 Numpy 相容的 C 程式碼(使用 Cython)。但是,這種依賴關係是可選的並且可以刪除。
原始碼可在 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,但需要一個數組作為輸入(雙精度類型),並且(可選)還通過將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 陣列(資料類型為 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.