EMD(经验模态分解)算法 二

上次基本搞懂了怎么用各种滤波器,这次重点看看EMD的算法应用,怎么调参数以产生不同的分解波形。

# EMD经验模态分解
emd <- as.data.frame(emd(xt=diff(load[,"Load"]),boundary="wave",stoprule="type2")$imf)
dat <- cbind(dat,data.frame("EMD"=c(NA,cumsum(rowSums(emd[,3:6])))))
g <- melt(dat[,c("Time","EMD","Load")],id.vars="Time",na.rm=TRUE)
levels(g[,2]) <- c("EMD","Load")
plot.cycles(g,"EMD vs. Load")
emdff <- data.frame("Time"=dat[,"Time"],"EMD.Filter"=dat$EMD)
emdfilter = ggplot(data=emdff, aes(x = Time, y = EMD.Filter )) + geom_hline(yintercept=0,colour="red") + geom_line(aes(color = EMD.Filter)) + labs(y="EMD Filter")
emdfilter

案例中没有提到怎么绘制不同的IMF,下面开始尝试,参考EMD包的手册。

Usage
emd(xt, tt=NULL, tol=sd(xt)*0.1^2, max.sift=20, stoprule=“type1”,
boundary=“periodic”, sm=“none”, smlevels=c(1), spar=NULL, alpha=NULL,check=FALSE, max.imf=10, plot.imf=FALSE, interm=NULL, weight=NULL)

基础用法

emd <- emd(xt=load[,"Load"])

此方法会生成一个三维数组结果

1.imf为分解得到的特征模态函数
2.residue为余下的残差
3.nimf为特征模态函数的个数

可选参数

emd <-emd(xt=load[,"Load"],boundary="wave",stoprule="type5")


参数说明:主要有两个,boundary和stoprule,参考官方手册说明:

转化为data.frame,方便操作

emd <-emd(xt=load[,"Load"],boundary="wave",stoprule="type5")


生成用于绘图的dataframe

emdff <- data.frame("Time"=dat[,"Time"],"EMD"=emd[,1])

绘图

emdfilter = ggplot(data=emdff, aes(x = Time, y = EMD )) + geom_hline(yintercept=0,colour="red") + geom_line(aes(color = EMD)) + labs(y="IMF1")
emdfilter

IMF1
这个图生成了颜色标签

下面做一个完整实验用于生成合成图

emd实施,参数选择boundary=wave,stoprule=type5,type5是最新的一种类型,分类出来的结果重复性也较小。

emd1<-emd(xt=load[,"Load"],boundary="wave",stoprule="type5")

创建一个用于存储图表的list

plotlist=list()

先绘制原负载函数

plotlist[[1]]<-ggplot(data=load, aes(x = Time, Load)) + geom_hline(yintercept=((max(load[,"Load"])+min(load[,"Load"]))/2),colour="red") + geom_line(size=0.5)

循环绘制IMF

for(i in 1: emd1$nimf+1) {
  print(i)
emdframe <- data.frame("Time"=dat[,"Time"],"EMD"=emd1$imf[,i-1])
plotlist[[i]]<-ggplot(data=emdframe, aes(x = Time, y = EMD)) + geom_hline(yintercept=0,colour="red")+ geom_line(size=.5)+ labs(y=paste("IMF",i-1))
}

绘制残差

resdat <- data.frame("Time"=dat[,"Time"],"EMD.residue"=emd1$residue)
plotlist[[emd1$nimf+2]]<-ggplot(data=resdat, aes(x = Time, y =EMD.residue)) + geom_hline(yintercept=((max(resdat[,"EMD.residue"])+min(resdat[,"EMD.residue"]))/2),colour="red")  + geom_line(size=.5)

绘制组合图

totalplot<-cowplot::plot_grid(plotlist=plotlist,ncol=1)#将p1-p4四幅图组合成一幅图,按照两行两列排列,标签分别为A、B、C、D。(LETTERS[1:4] 意为提取26个大写英文字母的前四个:A、B、C、D)
totalplot

图1 boundary=“wave”,stoprule=“type5”

boundary="wave",stoprule="type5"

全流程实现了只改emd函数的参数即可直接生成合成图,下面生成几个不一样参数的看看。

图2 boundary=“wave”,stoprule=“type2”

boundary="wave",stoprule="type2"

图3 boundary=“wave”,stoprule=“type3”

boundary="wave",stoprule="type3"

图4 boundary=“wave”,stoprule=“type4”

boundary="wave",stoprule="type4"

图5 boundary=“none”,stoprule=“type5”

boundary="none",stoprule="type5"

图6 boundary=“symmetric”,stoprule=“type5”

boundary="symmetric",stoprule="type5"

图7 boundary=“periodic”,stoprule=“type5”

boundary="periodic",stoprule="type5"

图8 boundary=“evenodd”,stoprule=“type5”

boundary="evenodd",stoprule="type5"

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EMD经验模态分解算法是一种局部平稳性分解技术,用于将时间序列分解成若干个组成部分,每个部分中包含不同的时间尺度和不同频率的信息,以更好地描述时间序列的特征。该算法能够充分利用时间序列数据的内在特征结构,适用性广泛。在EMD分解实验中,可以通过导入PyEMD工具库,构建信号并提取IMFs(内禀模态函数)和剩余信号。通过绘制IMFs和剩余信号的瞬时频率,可以更好地理解时间序列的特征。\[1\]\[3\]该模型还可以结合机器学习相关算法如神经网络或支持向量回归(SVR)等进行时间序列预测,以提高预测的准确性。\[1\]\[2\] #### 引用[.reference_title] - *1* *2* [基于EMD经验模态分解算法Python程序](https://blog.csdn.net/qq_41728700/article/details/129288324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python-经验模态分解EMD)分解及测试用例](https://blog.csdn.net/weixin_41990278/article/details/123127868)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值