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


11

我已经十多年没有研究统计学(然后只是基础课程),所以也许我的问题有点难以理解。

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

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

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

希望你有一些线索。对不起,我缺少适当的术语。


编辑:更多详细信息在这里:

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

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

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


我忘记了这一点:沿x轴的点具有不同的间距。

我不确定我是否理解。您没有y轴吗?

啊对不起 我输错了。我现在已经在上面进行了更改。

我还认为您需要提供更多信息。例如,我仍然无法可视化该图。你的目标是什么?

好的,对不起。我在上面添加了更多详细信息。

Answers:


10

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

稀释样品

如果您有太多实时观测数据,则可以始终使用简单的随机抽样来稀疏样本。请注意,为了做到这一点,点数必须非常大。

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

如果要顺序执行此操作,即在每个点上决定是否使用它,则只需接受概率为p的点。因此,如果您将p = 0.01设置为100,则平均可以接受1分。

如果数据分布不均匀,并且您只想稀疏点的密集区域,那么只需使稀疏功能更加复杂即可。例如,代替p,怎么办:

1pexp(λt)

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

您将需要尝试以下值 λp

平滑处理

可能类似于简单的移动平均类型方案。或者您可以选择更高级的功能,例如内核平滑器(如其他人所建议的)。您将需要注意不要太平滑,因为我认为在您的情况下突然下降应该很快发生。

应该有用于此类内容的C#库。

结论

如有必要,可先变薄,然后再光滑。


嗯,很有趣,但是我需要它是可预测的,即每次查看数据时都具有相同的结果。

在这种情况下,生成所选点的n个索引,然后存储这些索引。
csgillespie 2010年

或在采样前将种子存储到RNG中。
德克·埃德比布特

德克关于种子的解决方案可能是更好的选择。
csgillespie 2010年

每秒计算平均值是可以的,但是当没有特定时间的数据时我该怎么做。我想我可以在前后的几秒钟内进行一些插值,但是用一些特定的(命名)方法可以很好地做到这一点,因此我不会尝试发明已经发明的东西。

9

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

您的目标是生成可视化吗?在这种情况下,您可能想要保留原始数据,将其绘制为散点图,然后叠加某种集中趋势(回归线,样条线等)以传达应该带回家的消息。

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


是的,可视化是我想要的。我在问题中添加了更多信息。

其次用平滑线绘制原始数据。
JoFrhwld 2010年

第三,使用平滑线绘制原始数据---您可能还希望将BPM随时间的变化绘制为单独的可视化图。
约翰

5

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

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

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

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

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

由于时间单位和bpm不同,您可能需要考虑如何找到一种有意义的方式来缩放单位。要正确执行此任务,您应该与医生联系,他们最终必须解释您的图表并询问他们认为哪些信息是必不可少的。


有趣的帖子。我也将对此进行研究。你可能是对的。

2

如果BPM在许多样本上保持不变(或以您不关心的方式无限变化),则可以将数据截断为您真正关心的有效位数,然后执行“运行长度编码”。

例如,在R中,此数据:

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

有这个输出

rle(data)
Run Length Encoding
  lengths: int [1:3] 10 15 15
  values : num [1:3] 0 1 2

1

您没有提供足够的信息。为什么要减少数据点。这些天几千了。

假设您每次查看相同的数据都希望得到相同的结果,则可能只想对平均值求和。您在x轴上有可变的间距。也许您正在尝试使其保持一致?在这种情况下,您可以将bin宽度设置为50毫秒或100,然后平均其中的所有点。使bin宽度尽可能大,以将数据点减少到所需集合的大小。

没有理由说明为什么要删除数据,这确实是一个很难回答的问题。


好的,对不起。我在上面添加了更多详细信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.