算法:数据中是否存在线性趋势?

时间:2012-02-15 20:00:19

标签: algorithm linear trend

我有一个由整数x = [x1,...,xn],n <1 000 000的数组表示的连续输入数据。每两个元素满足以下条件x [i]&lt; x [i + 1]。

我需要尽可能快地检测出这样一个断点,这些断点会使这些数据的线性趋势结束并转变为二次趋势。数据始终以线性趋势开始......

我试图计算

k = (x[i+1] - x[i])/ (x[i] - x[i-1]) 

但是这个测试不太可靠......也许有一个更简单,更有效的统计测试......在这种情况下,回归线的计算速度很慢......

感谢您的帮助......

4 个答案:

答案 0 :(得分:1)

跟踪一阶导数和二阶导数。也就是说,保持x [i] -x [i-1]的均值和方差。并保持(x [i + 1] -x [i]) - (x [i] -x [i-1])的和与方差。

对于线性趋势,一阶导数的均值应该是常数,如果你观察到偏离均值(你可以用方差计算),那么你可以说出错了。二阶导数的均值应为0.

对于二次趋势,一阶导数的平均值增加。所以你会发现许多样本与平均值有很大偏差。二阶导数的行为类似于线性情形中一阶导数的行为。

算法(仅使用二阶导数):

  1. 对于每个输入,计算符号(+ ve或-ve)二阶导数
  2. 记录你最近有多少同质符号(即序列是 - + - ++++,答案是4)
  3. 如果同质符号的长度大于阈值(让我们说40?),则将其标记为二次序列的开头

答案 1 :(得分:0)

您可以在此处使用运行窗口回归。

W点上的线性回归系数的计算涉及形式X [i],i.X [i]和X [i] ^ 2的项的和。如果你存储这些总和,你可以通过推导最左边点的术语并添加最右边的术语(iX [i]变为(i + 1).X [i],ieiX [i]来轻松移动一个点+ X [1])。您的数据值是整数,不会有舍入累积。

这就是说,你可以在每个W连续点的恒定时间内计算运行回归,并检测相关系数的下降。

答案 2 :(得分:0)

对于超快速解决方案,您可以考虑进行如下测试:

| X[i + s] - 2 X[i] + X[i - s] | > k (X[i + s] - X[i - s])

选择好的s和k。

看一下|的情节X [i + s] - 2 X [i] + X [i - s] | /(X [i + s] - X [i - s])作为i的函数,用于增加s的值。

答案 3 :(得分:0)

实际上你计算了函数的导数。可能你应该使用更多的点来计算它,例如5,见Five-point stencil