我不确定这是否是正确的术语,但我想我希望s̶m̶o̶o̶t̶h̶̶a̶n̶d̶/̶o̶r̶近似数据集。我有30个数据点,如下图所示(带点的红线) 我想近似数据集,因此可以用更少的数据点来描述它。黑线表示我想要实现的目标。
我希望能够定义一个近似级别,它将控制结果数据集与原始数据集的差异程度。 近似数据集应包含一组数据点,我可以使用直线连接在一起。
解决此问题的正确算法或数学函数是什么?我不希望在这里实施,而是建议从哪里开始。
我编写了近似算法的实现。它适用于大多数情况,但在某些情况下它会返回非最佳数据。 以下示例显示了三条虚线。细红线是原始数据集,我的算法生成粗红黑色虚线,绿线是我想要实现的。
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;
});
答案 0 :(得分:1)
这里有两个选项:
在(1)情况下,您可以考虑模板近似(例如小波)或使用基本差分分析来检测并保持“毛刺”(例如网格)。 在(2)情况下,您可以使用MA,ARIMA来拟合,其中“故障”可以通过根进一步分析
答案 1 :(得分:1)
好的,澄清一下,您是希望平滑数据还是近似数据?如果要平滑数据,根据定义,它将消除数据系列中的小凹凸。另一方面,如果目标是准确描绘所有那些倾斜和颠簸,那么你不需要平滑。我要谈谈平滑,你告诉我你是否想要另一个。
好的,我知道平滑数据的最佳方法是使用alpha值。等式为T n + 1 =(1-α)T n +αData n + 1 。这意味着您设置受系列历史影响的下一个功能点的部分以及受当前数据点影响的部分。
Example graph with alpha = .5 看看这些数据。这里α= .5。所以函数符合数据,但不是很多。下面的一个是相同的,但alpha是.25。所以数据遵循的更少,但功能更顺畅。还有第三种选择,其中α随时间减小。最初它可能非常高,因此您可以快速跟踪数据,但随着α随着时间的推移而减小,趋势会变得更加平滑并且随着时间的推移保持平稳。最后,您可以设置最小α的硬限制。这将确保您始终对数据的响应能力最低。