我有一个由整数x = [x1,...,xn],n <1 000 000的数组表示的连续输入数据。每两个元素满足以下条件x [i]&lt; x [i + 1]。
我需要尽可能快地检测出这样一个断点,这些断点会使这些数据的线性趋势结束并转变为二次趋势。数据始终以线性趋势开始......
我试图计算
k = (x[i+1] - x[i])/ (x[i] - x[i-1])
但是这个测试不太可靠......也许有一个更简单,更有效的统计测试......在这种情况下,回归线的计算速度很慢......
感谢您的帮助......
答案 0 :(得分:1)
跟踪一阶导数和二阶导数。也就是说,保持x [i] -x [i-1]的均值和方差。并保持(x [i + 1] -x [i]) - (x [i] -x [i-1])的和与方差。
对于线性趋势,一阶导数的均值应该是常数,如果你观察到偏离均值(你可以用方差计算),那么你可以说出错了。二阶导数的均值应为0.
对于二次趋势,一阶导数的平均值增加。所以你会发现许多样本与平均值有很大偏差。二阶导数的行为类似于线性情形中一阶导数的行为。
算法(仅使用二阶导数):
答案 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