【发布时间】:2016-12-27 19:01:02
【问题描述】:
我不确定这是否是正确的术语,但我想我想用 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;
});
【问题讨论】:
-
你有没有尝试过?我怀疑是否有适合您的黑线的标准算法,因为您的 x 轴点的间距不均匀。考虑使用“移动平均线”对数据进行平滑处理,然后每 n 个点选取一次以减少点数。
-
为简化起见,我们假设 x 轴上的点与红点对齐,但红点较少。我编写了自己的算法来进行近似,该算法基本上从左到右并忽略了在一定公差范围内的所有点。如果某个值超出容差水平,则会创建一个新数据点并将其设置为新的比较基准。该算法工作正常,但在某些情况下它并不完美。这就是为什么我要问是否有任何通用的解决方案,所以我不必重新发明轮子。我在上面添加了我的算法的示例输出。
标签: charts time-series smooth approximation