如何以编程方式检测数据序列的片段以适合不同的曲线?


14

是否有记录在案的算法将给定数据集的各个部分分成最适合的不同曲线?

例如,大多数查看此数据图表的人都可以将其轻松分为3部分:正弦曲线段,线性段和反指数段。实际上,我是用正弦波,一条直线和一个简单的指数公式制作的。

包含三个不同部分的数据图表

是否存在用于查找类似零件的现有算法,然后可以将这些零件分别拟合到各种曲线/线上以形成一种最佳数据子集的复合系列?

请注意,尽管示例中段的末端几乎对齐,但这并不一定是这种情况。在分段截止时,这些值也可能突然震荡。也许这些情况将更容易发现。

更新:这是一小部分真实数据的图像: 真实世界图表

更新2:这是一组非常小的实际数据集(仅509个数据点):

4,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235

这,绘制,与appoximate的位置有些已知的真实世界元素边用虚线标记,奢侈品,我们通常不会有:

在此处输入图片说明

然而,我们确实拥有的一种奢望是事后观察:就我而言,数据不是时间序列,而是与空间相关的。一次分析整个数据集(通常为5000-15000个数据点)是有意义的,而不是持续进行。


1
ps首先发布简历;我是一名软件开发人员,通常我会更多地闲逛。道歉,如果我违反任何地方的禁忌。我对答案的许多搜索都是从这里开始的,所以我认为这将是最好的答案。
Whybird

您为什么不发布数据,我将尝试通过示例回答您的问题。
IrishStat 2015年

一种可能性是使用元模型一次拟合整个曲线系列。为了使事情更精确,假设您的最终目标是使直方图变得平滑,例如使用KDE。然后,如果使用的模型允许内核宽度在值的范围内变化(如此处使用的模型,如方程式(2)-(3)),则根据KDE进行的平滑估计将更加精确。X
user603 2015年

1
您构造了示例,以便使该想法有意义:到目前为止,很好。对于真实的直方图,更常见的是复杂的形状会反映出重叠分布的混合:然后,人们就不会关注观察到的直方图上的变化点,而这些变化点通常不会令人信服地存在或不是考虑混合的正确方法。但是,与统计科学中的标准相比,使用“直方图”的方式可能更广泛,在直方图中,它表示频率或概率分布的条形图(仅)。
尼克·考克斯

@IrishStat-通常的数据集有5000到15000个条目。我正在尝试为此处准备一个汇总的真实实例,但事实证明这是一个不好的例子,我必须重新开始。另一方面,这样做确实为我提供了部分答案,就简单地平滑和平均数据块以寻找初始模式而定,稍后再进行细化,为此,谢谢:)我有一个真正的宽只有509的那个看起来可能不错;可以的时候,我将其添加到问题中。
whybird 2015年

Answers:


2

我对问题的解释是,OP正在寻找适合所提供示例形状的方法,而不是HAC残差。另外,需要不需要大量人工或分析人员干预的自动化例程。尽管Box-Jenkins强调了这一主题,但可能并不适合,因为它们确实需要大量的分析人员参与。

R模块用于这种基于非矩的模式匹配。置换分布聚类是由Max Planck Institute科学家开发的一种模式匹配技术,可以满足您概述的条件。它的应用是时间序列数据,但不仅限于此。这是已开发的R模块的引用:

pdc:Andreas Brandmaier的R包,用于基于复杂度的时间序列聚类

除了PDC,还有机器学习,由UC Irvine的Eamon Keogh开发的iSax例程也值得比较。

最后,这篇论文 数据粉碎的文章:揭示数据中的潜伏次序由Chattopadhyay和Lipson撰写。除了聪明的头衔之外,还有一个认真的工作目标。摘录如下:“从自动语音识别到发现不寻常的恒星,几乎所有自动发现任务的基础都是相互比较和对比数据流,识别连接和发现异常值的能力。尽管数据盛行,但是自动化方法一个主要的瓶颈是当今大多数数据比较算法都依赖人类专家来指定哪些数据的“特征”与比较相关,在此,我们提出了一种新的原理来估计任意来源之间的相似性数据流,既不使用领域知识也不使用学习。我们演示了该原理在分析来自许多现实世界中具有挑战性的问题的数据时的应用,包括消除与癫痫发作有关的脑电图模式,从心音记录中检测出异常的心脏活动以及从原始光度法中对天文物体进行分类。在所有这些情况下,并没有获得任何领域的知识,我们表现出与由领域专家设计了专门的算法和启发式达到的精度相媲美的性能。我们建议,数据粉碎原则可能为理解日益复杂的观察结果打开大门,尤其是当专家不知道要寻找什么时。” 在所有这些情况下,在没有任何领域知识的情况下,我们展示的性能与领域专家设计的专用算法和启发式算法所达到的准确性相当。我们建议,数据粉碎原则可能为理解日益复杂的观察结果打开大门,尤其是当专家不知道要寻找什么时。” 在所有这些情况下,在没有任何领域知识的情况下,我们展示的性能与领域专家设计的专用算法和启发式算法所达到的准确性相当。我们建议,数据粉碎原则可能为理解日益复杂的观察结果打开大门,尤其是当专家不知道要寻找什么时。”

这种方法超出了曲线拟合的范围。值得一试。


谢谢-您是正确的,我想要的是在没有分析师干预的情况下自动查找集群。对于我想要做的事情,我需要将5000-15000个数据点的数据集划分为群集,每个群集都很好地符合简单的公式(包括重复的公式),而无需人工干预可容忍的时间范围内的大约50000个此类数据集由人类在家用计算机硬件上使用。
Whybird

至于适合每个群集的曲线,一旦我以任何方式检测到边界,就很简单,我想尝试一下不同的模型(正弦波,多项式,指数),看看哪一个可以提供更好的普通r ^ 2。
Whybird

2
好的,我认为沟通不畅是由以下原因引起的:Sax和iSax是用于存储和处理时间序列的表示形式,它们不是聚类或分段/模式检测算法(根据OP的帖子)。根据您的回答,我的理解是Keogh提出了一种基于SAX表示格式的算法,该算法恰好解决了OP的问题。但是我认为这不是你的意思吗?
朱巴卜2015年

2
好的,不需要接触Keogh,我知道iSaxSax,它们是用于有效挖掘时间序列的表示形式。链接解释了它们。iSax是较新的版本。我对您的答案的误解令我很兴奋,因此提出了问题(不是想学究):)。
朱巴卜2015年

2
我没有试图隐藏任何东西,而是将“ isax例程”解释为对isax进行操作的算法。我建议您的答案在澄清后需要重新措词/修改。
2015年

2

要检测时间序列中的变化点,需要构建一个健壮的全局ARIMA模型(在您的情况下,肯定会因模型变化和参数随时间变化而存在缺陷),然后在该模型的参数中确定最重要的变化点。使用您的509值,最重要的变化点是在周期353附近。我使用了AUTOBOX中的一些专有算法(由我协助开发),这些算法可能已获许可用于您的自定义应用程序。基本思想是将数据分为两个部分,并在找到最重要的变化点后分别重新分析两个时间范围(1-352; 353-509)中的每个,以确定两组中每个进一步的变化点。重复此过程,直到您有k个子集。我已使用此方法附加了第一步。在此处输入图片说明

在此处输入图片说明


当153和173的P值较低时,为什么353被标记?
尼克·考克斯

@NickCox好问题!伟大的注释出于预测目的,整个想法是将较新的(重要的)子集与较旧的子集分开,这就是353赢了……的原因。在这里,人们确实会选择173。
IrishStat 2015年

标题“最近的重大中断点”试图讲述这个故事
IrishStat 2015年

谢谢!这真的很有趣,非常感谢。我可能会与您联系以获取更多详细信息。
Whybird 2015年

感谢您的解释:在上个笔记中,这个想法确实很明确。(顺便说一句,我还没有,因为对90年代初见过这么多的大写的程序输出我建议将“95%置信水平”到“5%的显着性水平”假设是什么意思。)
尼克·考克斯

2

我认为该线程的标题具有误导性:您不是要比较密度函数,而是实际上是在时间序列中寻找结构性中断。但是,您没有通过查看时间序列的总历史来指定是应该在滚动时间窗口中还是事后发现这些结构性中断。从这个意义上说,您的问题实际上是对此的重复:哪种方法可以检测时间序列上的结构性断裂?

正如Rob Hyndman在此链接中提到的那样,R为此提供了strucchange包。我使用了您的数据,但我必须说结果令人失望[第一个数据点确实是4还是应该是54?]:

raw = c(54,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235)
raw = log(raw+1)
d = as.ts(raw,frequency = 12)
dd = ts.intersect(d = d, d1 = lag(d, -1),d2 = lag(d, -2),d3 = lag(d, -3),d4 = lag(d, -4),d5 = lag(d, -5),d6 = lag(d, -6),d7 = lag(d, -7),d8 = lag(d, -8),d9 = lag(d, -9),d10 = lag(d, -10),d11 = lag(d, -11),d12 = lag(d, -12))

(breakpoints(d ~d1 + d2+ d3+ d4+ d5+ d6+ d7+ d8+ d9+ d10+ d11+ d12, data = dd))
>Breakpoints at observation number:
>151 
>Corresponding to breakdates:
>163 

(breakpoints(d ~d1 + d2, data = dd))
>Breakpoints at observation number:
>95 178 
>Corresponding to breakdates:
>107 190 

我不是该软件包的普通用户。如您所见,它取决于适合数据的模型。您可以尝试

library(forecast)
auto.arima(raw)

为您提供最合适的ARIMA模型。


谢谢!我已经从标题中删除了“直方图”一词;最初,我误用了它,然后在响应注释的较早编辑中将其从正文中删除时,忘记编辑标题。
whybird 2015年

我的数据实际上是一系列与空间相关的数据,它不是基于时间的,通常不会经常出现在直线上,甚至不在平面上-但是您是正确的,在某个基本层次上可以将其视为同一数据办法; 我想这可能就是为什么我以前的搜索没有找到我所期望的答案的部分原因。
whybird 2015年

该示例中的第一个数据点实际上是4,但是很可能是我们碰巧碰到了先前结构的末尾,或者可能是噪音。我很乐意将其排除在外,但是无论我想出什么系统,都必须应对类似的问题。
Whybird 2015年

哦,分析是事后看来。我将编辑问题进行澄清。
Whybird 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.