Charts 如何逼近时间序列数据

Charts 如何逼近时间序列数据,charts,time-series,smooth,approximation,Charts,Time Series,Smooth,Approximation,我不确定这是否是正确的术语,但我想我想用s̶m̶o̶o̶t̶h̶a̶n̶d̶/̶o̶r̶近似一个数据集。我有30个数据点,如下图所示(带点的红线) 我想对数据集进行近似处理,这样就可以用更少的数据点来描述它。黑线代表我想要实现的目标 我希望能够定义一个近似级别,它将控制结果数据集与原始数据集的差异程度。 近似数据集应该包含一组数据点,我可以使用直线将它们连接在一起 解决这个问题的正确算法或数学函数是什么?我不希望在这里实现,而是从哪里开始提出一些建议 我编写了近似算法的实现。它在大多数情况下都有

我不确定这是否是正确的术语,但我想我想用s̶m̶o̶o̶t̶h̶a̶n̶d̶/̶o̶r̶近似一个数据集。我有30个数据点,如下图所示(带点的红线) 我想对数据集进行近似处理,这样就可以用更少的数据点来描述它。黑线代表我想要实现的目标

我希望能够定义一个近似级别,它将控制结果数据集与原始数据集的差异程度。 近似数据集应该包含一组数据点,我可以使用直线将它们连接在一起

解决这个问题的正确算法或数学函数是什么?我不希望在这里实现,而是从哪里开始提出一些建议

我编写了近似算法的实现。它在大多数情况下都有效,但在某些情况下它会返回非最佳数据。 下面的示例显示了三条虚线。细红线是原始数据集,粗红黑虚线是由我的算法生成的,绿线是我想要实现的

var-previousValue;
返回array.map(函数(dataPoint、index、fullArray){
var近似值=数据点;
如果(索引>0){
if(数学绝对值(先前值-值)<公差){
近似值=先前的值;
}否则{
previousValue=数据点;
}
}否则{
previousValue=数据点;
}
回归近似;
});

这里有两个选项:

  • 如果数据中显示的“小故障”很严重,意味着您无法平滑它
  • 如果显示的所有数据都可以近似,且“故障”无关紧要
  • 在(1)例中,可以考虑模板(例如小波)的近似,或者使用基本差分分析来检测和保持“毛刺”(例如网格)。


    在(2)种情况下,您可以使用MA、ARIMA进行拟合,其中可以通过根进一步分析“小故障”

    好的,澄清一下,您是希望平滑数据还是近似数据?如果要平滑数据,根据定义,它将消除数据序列中的小起伏。另一方面,如果目标是准确地描绘所有这些凹陷和凹凸,那么您不需要平滑。我要谈谈平滑,你告诉我你是否想要另一个

    好的,我知道平滑数据的最好方法是使用alpha值。方程为Tn+1=(1-α)Tn+αDatan+1。这意味着您设置了受系列历史记录影响的下一个功能点部分和受当前数据点影响的部分

    看看这些数据。这里的α=0.5。所以函数符合数据,但不是很多。下面的一个是相同的,但是alpha是.25。因此,数据的跟踪次数更少,但函数更平滑。还有第三种选择,α随时间减小。最初它可能非常高,因此您可以快速跟踪数据,但随着时间的推移,随着α的减小,趋势会变得更平滑,并随着时间的推移保持平滑。最后,您可以设置最小α的硬限制,这将确保您对数据的响应总是最小的


    你试过什么吗?我怀疑是否有一个标准算法适合你的黑线,因为你的x轴点不是均匀分布的。考虑使用“移动平均”来平滑数据,然后选择每一个N点以减少点的数量。为了简化事物,假设X轴上的点与红色点对齐,但较少。我写了自己的算法来做近似,基本上是从左到右,忽略了在一定公差范围内的所有点。如果某个值超过公差级别,将创建一个新的数据点并将其设置为新的比较基准。算法工作正常,但也有不完美的情况。这就是为什么我问是否有任何通用的解决方案,这样我就不必重新发明轮子了。我已经在上面添加了我的算法的示例输出。好的,谢谢你的解释。它帮助我明白我真正需要的是一个近似值。本质上,我希望减少数据点的数量,并尽可能地保持图形的原始形状。我的第一张图表显示了红色数据集近似为黑线的情况。我只需要5点来描述这条线(包括起点和终点)
            var previousValue;
            return array.map(function (dataPoint, index, fullArray) {
                var approximation = dataPoint;
    
                if (index > 0) {
                    if (Math.abs(previousValue - value) < tolerance) {
                        approximation = previousValue;
                    } else {
                        previousValue = dataPoint;
                    }
    
                } else {
                    previousValue = dataPoint;
                }
    
                return approximation;
            });