我是靠谱客的博主 贪玩八宝粥,最近开发中收集的这篇文章主要介绍【Matlab】时间序列周期性分析一、背景知识二、提出的方法(AUTOPERIOD)三、代码实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 参考文献和内容:

[1] Vlachos, Michalis & Yu, Philip & Castelli, Vittorio. (2005). On Periodicity Detection and Structural Periodic Similarity. Proceedings of the 2005 SIAM International Conference on Data Mining, SDM 2005. 10.1137/1.9781611972757.40. 

(PS:仅用于自己实验的粗糙笔记)

一、背景知识

1. 功率谱密度 (Power Spectral Density

参考:

做EEG频谱分析,看这一篇文章就够了! - 我爱神经科学网-脑科学-脑电EEG-事件相关电位ERP-磁共振MRI-fMRI-DTI-机器学习-深度学习

        其本质表现了了信号中 不同频率包含的功率。可以通过这种方法分析时间序列的周期。

        能量大的频率 >> 频率是周期的倒数 >> 最主要的周期。

        两种已知的功率谱密度估计方法:Periodogram ACF(使用DFT / 时间序列计算得到)

        目前来说,功率谱分析的方法大致可以分为两大类:第一类是经典的功率谱计算方法,第二类是现代功率谱计算方法。

        

         第一类经典功率谱分析方法,又可以分为直接法、间接法和改进的直接法。

        直接法又称之为周期图法Periodogram),简单地说,其直接利用信号的傅里叶变换系数的幅度平方来计算信号的功率谱。间接法又称为自相关函数法,其先估算出信号的自相关函数,然后对自相关函数求傅里叶变换从而得到信号的功率谱。改进的直接法,是针对直接法存在的缺点改进而来的方法,包括Barlett法、Welch法和Nuttall法。

1.1 Periodogram(直接法计算PSD)

        通过计算时间序列的 DFT 结果 X 得到

        

        其计算结果的每一个值说明了 信号不同频率 (k/N)所包含的能量

         

         例子: Periodogram 结果图中 Power最大的是 k/N 大概等于 0.14 左右,第二大是 0.03~0.04左右,周期为频率的倒数,因此,原时间序列所隐藏的周期一个为7 ,另一个周期为30.3333。

        劣势:在分析/提取隐藏的周期值比较大时表现效果不够好。

1.2 ACF (circular AutoCorrelation Function

        其本质是计算对于不同的滞后系数,评估时间序列与之前值的相似性。

        

        优势:ACF 比 Periodogram 更精确,尤其是对于所隐藏的周期数较大的时间序列。

        劣势:自动化寻找峰值比周期图难,需要使用者手动设置阈值;即便使用者选择了阈值,在周期大小为基础周期的倍数的情况下也都会出现峰值,因此需要引入去除假警报的后置模块;频率高但振幅小的活动表现的能量可能没有高振幅低频率的活动更明显。

        

         例子:ACF 图中周期数为 7 的能量大小不如周期为 30 的明显,因为对比时间序列图可以发现虽然周期数等于 7 的活动出现得更多,但是振幅(数量)小,而周期等于 30 的活动出现更少但振幅大,其能量在 ACF 图中更明显。

总结 :Periodogram 适合提取潜在周期小,ACF 适合提取大周期。

二、提出的方法(AUTOPERIOD

        该方法实在频域上分析周期显著性,再在时域上明确识别周期。

        由于在 ACF 上寻找显著周期比在 Periodogram 上寻找困难,他们使用 Periodogram 来提取周期。然后使用 ACF 来进行验证,因为ACF图的周期估计更精确。如果从 Periodogram 中得到的周期数在 ACF 的一个小峰值上,则可以将它视为一个有效周期,否则视为假警报。

  • 计算时间序列的 DFT (也可以不)
  • 计算 Periodogram ,寻找峰值点
  • 计算 ACF 判断是否在其峰值(线性上升阶段);如果是,则认为是有效周期,否则视作假。

        

         例子:基于MSN Query “Easter” 进行分析,Periodogram 的几个最大的峰值分别是333.333,166.667以及90.9091。但是匹配到ACF上,333.333需要矫正为 ACF 的图的峰值 357,其他两个视为假警报舍弃。

        其他:联合 Periodogram 和 ACF 的分析方法并不会比单独使用时候多携带额外的信息。

三、代码实现

Matlab 参考:

matlab入门图文教程 - 知乎

matlab 几行代码作图进阶2 - 知乎

matlab进阶3-几行代码实现图中图、局部放大图 - 知乎

 

1. 计算 Periodogram

Periodogram 参考:

Periodogram power spectral density estimate - MATLAB periodogram- MathWorks 中国
经典法谱估计(1)周期图法MATLAB及Python实现_流年亦梦的博客-CSDN博客_周期图法


 

寻找峰值 参考:

Matlab------------寻找峰值函数_知耻而后勇的蜗牛的博客-CSDN博客_matlab寻找峰值点

        Matlab 中有专门的函数 periodogram 实现直接法的 PSD 计算。

        参考公式

        

Xk = abs(fft(Data)); % 求dft变换后的模
N = length(Data);
k = 1:N;
Sx = Xk.^2/N; % 求模的平方/N
% 归一化 PS:Sx 为对称图像,且在0能量无限大,绘制时选择从较后的地方开始,N的大小跟着Sx大小变化
minv = min(Sx(4:88));
maxv = max(Sx(4:88));
Sx_nor = (Sx(4:88) - minv)/(maxv - minv);
% 绘图
plot(fk_N,Sx_nor,'k','linewidth',1.2);
grid on
xlim([0.0118 0.5082]); % 自行修改合适的范围
ylim([0.000 1.1000]); % 自行修改合适的范围
ylabel('Power');
title('Periodogram');
set(gca, 'fontsize',14);
% 标峰值点
[pks,locs] = findpeaks(Sx_nor, fk_N, 'npeaks', 3);
hold on
plot(locs, pks, 'ro', 'MarkerFaceColor', 'r', 'Markersize', 10)
p1 = 1/locs(1);
text(locs(1)+0.005, pks(1) + 0.1, strcat('p1 = ',num2str(p1)), 'fontsize', 14);
p2 = ...

2. 计算 ACF

ACF 参考:

Sample autocorrelation - MATLAB autocorr- MathWorks 中国

        调用 matlab 函数 autocorr

autocorr(Data, Numlags=40); % 自行设定Numlags大小
grid on
set(gca, 'fontsize',14);

最后

以上就是贪玩八宝粥为你收集整理的【Matlab】时间序列周期性分析一、背景知识二、提出的方法(AUTOPERIOD)三、代码实现的全部内容,希望文章能够帮你解决【Matlab】时间序列周期性分析一、背景知识二、提出的方法(AUTOPERIOD)三、代码实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(182)

评论列表共有 0 条评论

立即
投稿
返回
顶部