如何减少系列中的数据点数量?

机器算法验证 数据可视化
2022-03-25 22:09:36

我已经 10 多年没有学习统计学(然后只是一门基础课程),所以我的问题可能有点难以理解。

无论如何,我想做的是减少一系列数据点的数量。x 轴是自测量开始以来的毫秒数,y 轴是该点的读数。

通常有数千个数据点,但我可能只需要几百个。所以我的问题是:如何准确减少数据点的数量?

这个过程叫什么?(所以我可以谷歌它)是否有任何首选算法(我将在 C# 中实现它)

希望你能得到一些线索。对不起,我缺乏适当的术语。


编辑:更多细节在这里:

我得到的原始数据是心率数据,形式为自上次心跳以来的毫秒数。在绘制数据之前,我计算第一个样本的毫秒数,以及每个数据点的 bpm(每分钟节拍数)(60000/timesincelastbeat)。

我想可视化数据,即将它绘制成折线图。我想将图表中的点数从数千减少到数百。

一种选择是计算系列中每一秒或每 5 秒左右的平均 bpm。如果我知道每个周期(5 秒间隔的秒数)至少有一个样本,那将非常容易。

4个回答

你有两个问题:太多的点以及如何平滑剩余的点。

稀释样品

如果你有太多的实时观察结果,你总是可以使用简单的随机抽样来稀释你的样本。请注意,因为这也是正确的,点的数量必须非常大。

假设你有N个点,而你只想要其中的n个。然后从离散的均匀U(0, N-1)分布中生成n 个随机数。这些将是您使用的点。

如果您想按顺序执行此操作,即在您决定是否使用它的每一点,则只需接受概率为p的点。因此,如果您设置p=0.01,您将接受(平均)一百分之一。

如果您的数据分布不均匀,并且您只想细化点的密集区域,那么只需使细化功能更加复杂。例如,不是p ,而是:

1pexp(λt)

其中是正数,是自上次观察以来的时间。如果两点之间的时间很大,即很大,则接受一个点的概率为 1。相反,如果两个点靠得很近,则接受一个点的概率将为λtt1p

您将需要试验的值。λp

平滑

可能类似于简单的移动平均类型方案。或者你可以选择更高级的东西,比如内核平滑器(正如其他人所建议的那样)。您需要注意不要过度平滑,因为我认为在您的场景中应该很快地拾取突然下降。

应该有可用于这类东西的C#库。

结论

必要时变薄,然后平滑。

好吧,我认为您要查找的词是“采样”,但我不确定您为什么要这样做。数千个数据点并不是很多。或者您只是想绘制较少数量的等距点?这通常称为“分箱”。

您的目标是生成可视化吗?在这种情况下,您可能希望保留原始数据,将其绘制为散点图,然后覆盖某种集中趋势(回归线、样条曲线等)以传达应有的信息。

还是您的目标是以某种方式对结果进行数字总结?在这种情况下,您可能需要更详细地解释您的问题!

计算平均值会导致不同的数据集,而不是简单地减少数据点的数量。如果每分钟一次心跳比另一次心跳快得多,您将在平滑过程中丢失信号。

如果您将 125-125-0-125-125 汇总为 100,则数据所讲述的故事通过您的平滑处理会有所不同。

有时心脏甚至会跳动,我相信这是一个有趣的事件,但想要查看绘制的心率数据。

因此,我建议您使用类似的公式计算两点之间的距离d=sqrt((time1-time2)^2 + (bpm1-bpm2))

您在程序中设置了最小距离。然后您遍历您的数据,并在每个点之后删除所有 d 小于最小距离的后续点。

由于时间单位和 bpm 不同,您可能需要考虑如何找到有意义地缩放单位的方法。要正确完成这项任务,您应该与最终必须解释您的图表的医生交谈,并询问他们认为哪些信息是必不可少的。

为了减少数据点,您可以使用非常容易理解和实现的Ramer–Douglas–Peucker 算法。采样信号将与原始信号非常相似。