如何在数据中找到周期性?

20

我有一个数据集(数组),需要找出其中的周期性。我该如何操作?有人说可以使用FFT,但我不确定它如何给我提供周期性信息。谢谢您的帮助!

5个回答

15

对于这个任务,最好使用自相关。

FFT是寻找周期性的错误工具。

例如,考虑一个情况,您的波形由两个简单正弦波相加而成,一个周期为2秒(0.5 Hz),另一个周期为3秒(0.333 Hz)。这个波形将具有6秒的周期性(即2*3),但傅里叶谱仅显示0.5 Hz和0.333 Hz的两个峰值。


1
你会如何使用自相关来实现这个任务?你能简单概述一下吗? - easytarget
3
这个想法非常简单:只需获取自相关并找到峰值(不是在0处)。因此唯一的问题是如何执行自相关并找到结果的峰值。如何执行取决于您使用的工具;虽然您可以从头开始操作,但大多数人会使用一些数据分析软件包。我的简要概述可能没有帮助,因此我建议您选择一个您喜欢的方法,尝试一下,如果遇到问题,请提出具体的问题。 - tom10
我尝试了第一个答案的方法,使用https://dev59.com/XXRB5IYBdhLWcg3wXmRI来自相关我的数据。这会给出一个递减的数字序列。峰值并没有提供任何关于周期性的信息。在对正弦函数进行测试时,我得到了一个递减的振荡。我应该如何找到周期性? - easytarget
1
@MusséRedi:我应该更清楚一些...我的意思是在StackOverflow上创建一个新的问题。然后你可以展示你的代码、图表等所有重要细节,并得到完整的答案。(对于正弦波,周期将是第一个峰值的时间。它可能会因为你的实现细节而衰减,并且并不特别有意义,但随着波形的移动越来越多,重叠的部分就越少了。但真的,只需在SO上发布一个新问题即可。) - tom10
我在https://dev59.com/6n_aa4cB1Zd3GeqP7cTT发布了我的问题,你能看一下吗? - easytarget

5

周期性是一个没有明确定义的术语。例如,以下数据:

1, 10, 1, 10, 1, 11, 1, 10, 1, 10, 1, 11, 1, 10, 1, 10, 1, 11

您可以将其视为具有不精确但强烈的2个周期性,并具有6个精确周期性。

对于精确周期性,您可以尝试将给定数据作为重复两次的数据的子字符串查找。

对于现实、嘈杂信号的非精确周期性,可以使用时间域和频率域方法。

时间域方法是自相关。它类似于上面的子字符串搜索:在数据具有最大自相似性的移位值上搜索。

对于简单的信号,计数阈值转换可能足够。

频率域方法包括使用FFT/FHT的方法:在频谱中搜索最大值,该最大值给出周期的1/T。

另一种方法是使用Cepstrum


意思是通过“自相关”来进行自相关。 - Mr. Panda

2
这篇新论文并没有受到太多关注,它是关于谱聚类的。
引用:

Amariei, C., Tomita, M., & Murray, D. B. (2014). Quantifying periodicity in omics data. Frontiers in cell and developmental biology.

该算法已经实现在一个R包中,可以在oscillat.iab.keio.ac.jp上获得。我与作者无关,但已将代码放在GitHubhere以便更方便地获取(主要脚本here)。

使用DFT并将行分组为主要频谱功率,根据我的经验很好用。显然,对于基因组学而言,它被设计为强大的(在代码中注明它计算量较大),因此可能取决于应用程序。

1

你可以使用FFT,因为它将把你的数据集从值空间转换到频率空间。

这意味着你最终会得到一组频率,这些频率组合起来会产生你想要分析的初始输入。然后,你可以轻松地识别由特定频率生成的主要贡献,因此你将了解有多少周期性以及哪些是最具影响力的。

在这里看看:http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/dft/


1

这个链接似乎已经失效了,但我找到了类似的东西,使用奇异值分解来找到数据的周期性:http://pre.aps.org/abstract/PRE/v59/i4/p4013_1 - Magsol
我刚刚检查了链接,它似乎为我打开了PDF文件。如果您在Google学术上搜索链接的标题,可能会有其他链接可供尝试。 - bnsmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接