我有一个由整数数组表示的连续传入数据x = [x1,...,xn], n<1 000 000
。每两个元素都满足以下条件x[i] < x[i + 1]
。
我需要尽快检测到这样一个断点,这些数据的线性趋势在此结束并转变为二次趋势。数据总是以线性趋势开始...
我试图计算
k = (x[i+1] - x[i])/ (x[i] - x[i-1])
但是这个测试不太可靠......也许有一个更简单有效的统计测试......在这种情况下回归线的计算很慢......
跟踪一阶推导和二阶推导。即保持x[i]-x[i-1]的均值和方差。并保持 (x[i+1]-x[i]) - (x[i]-x[i-1]) 的总和和方差。
对于线性趋势,一阶导数的平均值应该是恒定的,如果您观察到与平均值的偏差(您可以使用方差计算),那么您可以说有问题。二阶导数的平均值应为 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 的值。
实际上,您计算函数的导数。可能您应该使用更多的点来计算它,例如 5,请参阅五点模具
您可以在此处使用运行窗口回归。
W 点的线性回归系数的计算涉及 X[i]、iX[i] 和 X[i]^2 形式的项的总和。如果存储这些总和,您可以通过推导最左边点的项并添加最右边点的项(iX[i] 变为 (i+1).X[i],ieiX[i] +X[i])。您的数据值是整数,不会有舍入累积。
也就是说,您可以在恒定时间内计算每个 W 个连续点的运行回归,并检测相关系数的下降。