为了聚类一组时间序列,我正在寻找智能距离度量.我尝试了一些众所周知的指标,但没有人适合我的情况.
例:我们假设我的聚类算法提取了这三个质心[s1,s2,s3]:

我想把这个新的例子[sx]放在最相似的集群中:
最相似的质心是第二个,所以我需要找到一个给我d(sx, s2) < d(sx, s1)和我的距离函数dd(sx, s2) < d(sx, s3)
编辑
这里的结果与指标[余弦,欧几里德,闵可夫斯基,动态类型翘曲]
] 3
编辑2
我正在比较用于 DTW 计算的库dtaidistance、fastdtw和cdtw。这是我的代码:
from fastdtw import fastdtw
from cdtw import pydtw
import fastdtw
import array
from timeit import default_timer as timer
from dtaidistance import dtw, dtw_visualisation as dtwvis
s1 = mySampleSequences[0] # first sample sequence consisting of 3000 samples
s2 = mySampleSequences[1] # second sample sequence consisting of 3000 samples
start = timer()
distance1 = dtw.distance(s1, s2)
end = timer()
start2 = timer()
distance2 = dtw.distance_fast(array.array('d',s1),array.array('d',s2))
end2 = timer()
start3 = timer()
distance3, path3 …Run Code Online (Sandbox Code Playgroud) 我正在寻找有关动态时间扭曲 (DTW) 的一些建议。
我有一个 Python 脚本并从各种长度的 .WAV 文件中提取梅尔频率倒谱系数 (MFCC) 特征向量。特征向量是不同长度的数组,包含 12 个 MFCC 的数组。
例如,一个 .WAV 文件可以由包含 10 个 12 个特征向量的 10 组的数组表示,而另一个 .WAV 文件可以由包含 20 个 12 个特征向量的一组数组表示。
我打算使用 DTW 来比较两个数组数组,但我不确定如何。我理解 DTW 的概念,如果数组中包含的特征向量是单个数字,那么实现它就没有问题,我的困惑是因为它们是数组。
Tl; dr:如何使用 DTW 比较两个数组数组?
编辑:我已阅读此问题但无济于事。
非常感谢,亚当
我已经将动态时间扭曲实现从普通 python 重写为 Tensorflow。但它确实很慢——比预先计算距离并将其作为数据加载到 Tensorflow 中慢得多。我不明白为什么它很慢或如何改进它。
我还尝试使用签名转换其他 DTW 实现,但没有成功。有什么建议么?
def tfDTW(s1, s2):
r = tf.cast(tf.shape(s1)[0], tf.int32)
c = tf.cast(tf.shape(s2)[0], tf.int32)
window = tf.math.reduce_max([r,c])
max_step = max_dist = 1e7
penalty = psi = tf.constant(0, dtype=tf.float64)
length = tf.math.reduce_min([c + 1, tf.math.abs(r - c) + 2 * (window - 1) + 1 + 1 + 1])
indices = [0,-1]
dtw = tf.one_hot(indices, depth = length,
on_value=0.0, off_value=1e7,
axis=-1) # output: [2,length]
dtw=tf.cast(dtw, tf.float64)
last_under_max_dist = tf.constant(0)
skip = tf.constant(0)
i0 …Run Code Online (Sandbox Code Playgroud) 我有10-20k个不同的时间序列(24维数据-一天中的每个小时的一列)之间的某个地方,我对聚类的时间序列表现出大致相同的活动模式感兴趣。
我最初开始实施动态时间规整(DTW),因为:
我使用DTW遇到的唯一问题是,它似乎无法很好地扩展- fastdtw在500x500的距离矩阵上花费了大约30分钟。
还有哪些其他方法可以帮助我满足条件2和3?
我发现这两篇文章讨论使用动态时间扭曲或 DTW 来对齐多个“n”个时间序列。
如何在 python 中在 3 个或更多信号之间应用/实现动态时间规整 (DTW) 或快速动态时间规整 (FastDTW)? 使用 numpy 或 cython 进行高效的成对 DTW 计算
然而,他们未能描述为所有“n”个时间序列找到最小距离路径所涉及的所有步骤。
在上述链接的答案之一中,它指出计算所有成对路径的距离矩阵。但是,没有提到如何处理距离矩阵,以便创建一个具有“n”个时间序列的图,这些时间序列都最佳对齐。
您将如何获取距离矩阵(“n”个时间序列之间的成对距离)并对齐所有“n”个时间序列?
或者,是否有不同的方法来对齐所有“n”个时间序列?
我尝试运行 dtaidistance 但根据示例运行以下代码时:
from dtaidistance import dtw
import numpy as np
timeseries = np.array([
[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(timeseries, block=((1, 4), (3, 5)))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
The compiled …Run Code Online (Sandbox Code Playgroud) 我有 6 个时间序列值,如下所示。
import numpy as np
series = np.array([
[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]])
Run Code Online (Sandbox Code Playgroud)
假设,我想获取动态时间扭曲的距离矩阵来执行聚类。我dtaidistance为此使用了库,如下所示。
from dtaidistance import dtw
ds = dtw.distance_matrix_fast(series)
Run Code Online (Sandbox Code Playgroud)
我得到的输出如下。
array([[ inf, 1.41421356, 2.23606798, 0. …Run Code Online (Sandbox Code Playgroud) 我有两个标准化读取计数矩阵,用于时间序列第 1 天到第 26 天的控制和治疗。我想通过动态时间包裹计算距离矩阵,然后使用它进行聚类,但似乎太复杂了。我这样做了;谁可以帮忙提供更多说明?多谢
> head(control[,1:4])
MAST2 WWC2 PHYHIPL R3HDM2
Control_D1 6.591024 5.695156 3.388652 5.756384
Control_D1 8.043454 5.365221 6.859768 6.936970
Control_D3 7.731590 4.868267 6.919972 6.931073
Control_D4 8.129948 5.105528 6.627016 7.090268
Control_D5 7.690863 4.729501 6.824746 6.904610
Control_D6 8.101723 5.334501 6.868990 7.115883
>
> head(lead[,1:4])
MAST2 WWC2 PHYHIPL R3HDM2
Lead30_D1 6.418423 5.610699 3.734425 5.778046
Lead30_D2 7.918360 4.295191 6.559294 6.780952
Lead30_D3 7.807142 4.294722 6.599187 6.716040
Lead30_D4 7.856720 4.432136 6.572337 6.848483
Lead30_D5 7.827311 4.204738 6.607107 6.784094
Lead30_D6 7.848760 4.458451 6.581216 6.943003
>
> …Run Code Online (Sandbox Code Playgroud)