时间序列距离度量

时间:2018-01-29 09:13:10

标签: time-series distance hierarchical-clustering dtw

为了聚集一组时间序列,我正在寻找智能距离度量。 我尝试了一些众所周知的指标,但没有人适合我的情况。

ex:让我们假设我的聚类算法提取这三个质心[s1,s2,s3]: enter image description here

我想把这个新例子[sx]放在最相似的集群中:

enter image description here

最相似的质心是第二个,所以我需要找到一个距离函数d,它给我d(sx, s2) < d(sx, s1)d(sx, s2) < d(sx, s3)

修改

这里的结果与指标[余弦,欧几里德,闵可夫斯基,动态类型翘曲] enter image description here] 3

编辑2

用户Pietro P建议在累积版本的时间序列中应用距离 解决方案有效,这里是图表和指标: enter image description here

4 个答案:

答案 0 :(得分:5)

好的问题!使用R ^ n(欧几里德,曼哈顿或一般minkowski)的任何标准距离超过那些时间序列都无法达到你想要的结果,因为这些指标独立于R ^ n坐标的排列(时间是严格排序的,它是你想捕捉的现象。

一个简单的技巧,可以做你要求的是使用累积版本的时间序列(随着时间的推移,随时间推移的总和值),然后应用标准指标。 使用曼哈顿指标,您可以获得两个时间序列之间的距离区域之间的累积版本

答案 1 :(得分:2)

另一种方法是利用DTW,它是一种计算两个时间序列之间相似度的算法。全面披露;我为此编写了一个名为trendypy的Python包,您可以通过pip(pip install trendypy)下载。 Here是有关如何使用程序包的演示。您基本上只是在计算不同组合的总最小距离,以设置聚类中心。

答案 2 :(得分:0)

如果使用标准Pearson correlation coefficient?,那么您可以将新点分配给系数最高的群集。

public void genericForEachLoop(POITextExtractor te) { final String[] tagArrays = {"KEYWORDS", "CUSTOMERS", "SYSTEM_DEPS", "MODULES", "DRIVE_DEFS", "PROCESS_IDS"}; ArrayList<String> al = new ArrayList<String>(); for(int i=0; i<tagArrays.length; i++) { System.out.println(tagArrays[i]); al = tagArrays[i]; for (String item : al) { if (te.getText().contains(item)) { System.out.println(item); } } } }

答案 3 :(得分:0)

Pietro P的答案只是将卷积应用于时间序列的一种特殊情况。

如果我给了内核:

[1,1,...,1,1,1,0,0,0,0,...0,0]

我将获得一个累积序列。

添加卷积之所以可行,是因为您要为每个数据点提供有关其邻居的信息-现在它与顺序有关。

尝试使用高斯卷积或其他内核可能会很有趣。