【问题标题】:Is there a linear trend in data?数据是否存在线性趋势?
【发布时间】:2012-03-07 05:03:21
【问题描述】:

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

我需要尽快检测到这样一个断点,这些数据的线性趋势在此结束并转变为二次趋势。数据总是以线性趋势开始...

我试着计算

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

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

【问题讨论】:

  • 这怎么不靠谱?你的数据有多精确?你的线性趋势中有多少“摆动”,是真实数据(测量)还是数字(数学完美)数据等?
  • 我们只测试小区间,只测试三元组......这不可靠......数据代表一些累积值,其中预测线性或亚线性趋势。但我没有关于数据的任何其他信息...
  • 您查看过数据图吗?有多吵?如果您无法通过肉眼大致看到线性行为变为二次的位置,那么您将无法使用计算机做得更好。如果可以,那么根据噪声,可以通过比较相邻点来实现,或者您可能必须回顾许多步骤才能检测到趋势。

标签: algorithm trend


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    跟踪一阶推导和二阶推导。即保持x[i]-x[i-1]的均值和方差。并保持 (x[i+1]-x[i]) - (x[i]-x[i-1]) 的总和和方差。

    对于线性趋势,一阶导数的平均值应该是恒定的,如果您观察到与平均值的偏差(您可以使用方差计算),那么您可以说有问题。二阶导数的均值应为 0。

    对于二次趋势,一阶导数的平均值增加。因此,您会发现许多样本与均值的偏差很大。二阶导数的行为类似于线性情况下一阶导数的行为。

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

    1. 对于每个输入,计算符号(+ve 或 -ve)二阶导数
    2. 跟踪您最近获得了多少同质符号(即,如果序列是 -+-++++,则答案是 4)
    3. 如果同质符号的长度大于阈值(假设为 40 ?),则将其标记为二次序列的开头

    【讨论】:

      【解决方案3】:

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

      | 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 的值。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-05-10
          • 2022-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          • 1970-01-01
          • 1970-01-01
          • 2018-03-10
          相关资源
          最近更新 更多