精华内容
下载资源
问答
  • 经验模态分解算法

    2018-04-27 20:01:40
    完整的经验模态分解算法,emd,非常全,速度保存 ,希尔伯特黄变换
  • 为了解决周界入侵行为识别正确率低的问题, 对经验模态分解算法进行改进, 并将其用于光纤布拉格光栅周界入侵行为分类。该方法利用短时平均过零率从整体信号中提取入侵信号, 采用两次极值波延拓抑制经验模态分解算法的...
  • 包含IMF本征模函数,包含信号频谱分析等详细代码,有详细注释
  • 相机成像过程中与地面的相对运动、遥感平台姿态变化、发动机振动、电磁波干扰等都会导致质退化而造成影像模糊,为此提出了一种基于二维经验模态分解算法的遥感影像去模糊方法。结合分解后的本征模函数IMF分量实现对...
  • 快速二维经验模态分解算法
  • 利用matlab编写的经验模态分解算法,主函数为eemd.m
  • 提出迭代Toeplitz滤波器算法作为替代迭代算法用于经验模式分解(EMD)。 在这种替代算法中, 上下包络的一部分被获得的某些“移动平均值”代替通过低通滤波器。 通过这种移动执行传统的筛选算法平均等效于迭代某些...
  • 相机成像过程中与地面的相对运动、遥感平台姿态变化、发动机振动、电磁波干扰等都会导致质退化而造成影像模糊,为此提出了一种基于二维经验模态分解算法的遥感影像去模糊方法。结合分解后的本征模函数IMF分量实现对...
  • 内涵2012版emd eemd ceemdan算法资料,有一个案例文件
  • 经过详细研究信号音的时频特性,以及网络传输的误差因素,提出了一种新的适用于下行噪声抑制系统的信号音检测算法,这种算法利用每帧信号的频域功率变化和时域信号周期变化来检测信号音,经过理论的评估和实际的验证...
  • EMD(经验模态分解算法

    千次阅读 2020-11-13 15:28:12
    # EMD经验模态分解 emd (emd(xt=diff(load[,2]),boundary="wave",stoprule="type2")$imf) dat (dat,data.frame("EMD"=c(NA,cumsum(rowSums(emd[,3:6]))))) g (dat[,c(1,7,4)],id.vars="Time",na.rm=TRUE) levels(g...

    参考R语言提取时间序列的周期性成分应用EMD,小波滤波器,BAXTER过滤器等的方法进行应用。

    第一次尝试

    首先安装依赖包

    # install.packages("reshape2")
    # install.packages("plm")
    # install.packages("ggplot2")
    

    加载包

    library(reshape2)
    library(plm)
    library(ggplot2)
    

    读取数据

    load<-data.frame(read.csv("安徽最高.csv"))
    

    观察数据

    load
    

    观察数据
    重命名

    names(load) <- c("Time","Load")
    

    取对数

    load[,"Load"] <- log(load[,"Load"]) 
    

    观察对数负载随时间的变化

    ggplot(load,aes(x=Time,y=Load)) + geom_line(size=.5) + theme_classic() + labs(title="对数负载")
    

    对数负载
    形状如上,波动还是挺大,冬天夏天用电处于高峰,没有特别明显的线性或非线性趋势。
    尝试去除线性趋势看看。

    dat <- data.frame("Time"=load[,"Time"],"Linearly.Detrended"=time.detrend)
    

    报错

    Error in data.frame(Time = load[, “Time”], Linearly.Detrended = time.detrend) :
    找不到对象’time.detrend’

    不知道为啥。。。time.detrend没用,怀疑作者少复制一行代码,全网没找到相关的代码。。跳过这一步。
    找作者买来了代码,下面继续。。

    先要对用负载对时间进行回归,获得残差,去除时间趋势

    time.detrend <- residuals(lm(Load~ Time, data=load))
    

    存储数据

    dat <- data.frame("Time"=load[,"Time"],"Linearly.Detrended"=time.detrend)
    

    看看结果

    ggplot(dat,aes(x=Time,y=Linearly.Detrended)) + geom_hline(yintercept=0,colour="grey80") + geom_line(size=.5) + theme_classic() + labs(title="Linearly Detrended",y="")
    

    Linearly Detrended
    长得基本一模一样。。说明基本不存在线性趋势。

    另一个类似的图

    timedetrending = ggplot(dat = load, aes(x = Time, y = time.detrend)) + geom_hline(yintercept=0,colour="red") + geom_line(aes(color = time.detrend)) + labs(y="Linearly Detrended")
    

    Linearly Detrended

    做差分看看

    
    # 差分
    # 第一次差分 first difference
    fd <- diff(load[,"Load"])
    # 绘图
    dat <- data.frame("Time"=dat[,"Time"],"First.Difference"=c(NA,fd),"Linearly.Detrended"=dat[,"Linearly.Detrended"])
    g <- melt(dat,id.vars="Time",na.rm=TRUE)
    levels(g[,2]) <- c("First Difference","Linear Trend")
    # Define plot function
    plot.cycles <- function(d,t) {
      ggplot(g,aes(x=Time,y=value,linetype=variable)) + 
        geom_hline(yintercept=0,colour="grey80") + # Create a horizontal line with value 0
        geom_line( size=.5) + # Create line with series and specify its thickness
        labs(x="Time",y="",title=t,linetype="Legend:") + # Title of the legend
        coord_cartesian(xlim=c(min(g[,1]),max(g[,1]))) + # Set displayed area
        guides(linetype=guide_legend()) + # Set the variables contained in the legend
        theme(legend.position="bottom", # Position of the legend
              legend.key=element_rect(fill="white"), # Set background of the legend keys
              panel.background = element_rect(fill = "white"), # Set background of the graph
              axis.line=element_line(size=.3,colour="black"), # Set the size and colour of the axes
              axis.text=element_text(colour="black"), # Set the colour of the axes text
              panel.grid=element_blank()) # Set grid lines off
    }
    # Plot
    plot.cycles(d=g,t="Linearly Detrended vs. First Difference")
    

    差分和linearly detrended的对比图
    Linearly Detrended vs. First Difference

    使用Hodrick Prescott过滤器

    hp <- hpfilter(load[,"Load"],freq=1600)$cycle # Apply filter and obtain data of the cycle compontent
    dat <- cbind(dat,data.frame("Hodrick.Prescott"=hp))
    dat
    g <- melt(dat[,c(1,4,3)],id.vars="Time",na.rm=TRUE)
    levels(g[,2]) <- c("Hodrick Prescott","Linearly Detrended")
    plot.cycles(g,"Hodrick Prescott vs. Linearly Detrended")
    hpff <- data.frame("Time"=dat[,"Time"],"Hodrick.Prescott"=hp )
    hpfilter = ggplot(data=hpff, aes(x = Time, y = hpff$Hodrick.Prescott )) + geom_hline(yintercept=0,colour="red") + geom_line(aes(color = Hodrick.Prescott)) + labs(y="Hodrick Prescott")
    hpfilter
    

    Hodrick.Prescott
    Hodrick和Prescott(1981)开发了一种滤波器,它将时间序列分为趋势,周期和噪声分量。该hpfilter功能包含在mFilter包中,需要时间序列和平滑参数。文献表明后者的值为1600。但是,也可以选择更高的值。
    下图显示了Hodrick-Prescott滤波器获得的实际GDP的周期性成分值,并将其与线性去趋势系列的值进行了比较。两个系列的行为看起来非常相似,只是HP系列在零附近波动较大,而线性去趋势系列仍然包含趋势的组成部分。此外,循环HP系列还包括一些类似噪音的组件。
    Hodrick Prescott vs. Linearly Detrended

    Baxter和King(1994,1999)提出了一种滤波器,它可以产生与HP滤波器类似的结果,但它可以消除上面显示的许多类似噪声的行为。该功能bkfilter也包含在mFilter包中。它需要系列,周期数量的下限和上限,假定周期发生(pl和pu),以及平滑因子nfix。文献(参见NBER,Stock和Watson(1999))表明商业周期持续6至32个月。这些值用于指定循环周期的下限和上限。BK滤波器的结果如下图所示。该方法的一个相对系列的缺点是平滑因子导致在系列的开始和结束时观察的丢失。这可能是小样本的问题。
    Baxter King vs. Hodrick Prescott

    小波滤波器

    Yogo(2008)提出使用小波滤波器从时间序列数据中提取商业周期。这种方法的优点是该功能不仅可以提取系列的趋势,周期和噪声,而且可以更加具体地说明周期发生的周期。然而,由于该技术只能捕获2的幂的周期性,即2,4,8,16,32等,所以没有完全的自由度。
    R中的方法实现也很简洁,但在使用之前需要一些额外的数据转换。一个有用的功能包含在waveslim包中并被称为mra(“多分辨率分析”)。它需要时间序列的不同版本和分解的深度。
    该函数给出了多个系列,必须将它们累积起来cumsum,将它们转换回反映周期性模式的数据。此外,一些系列可以结合使用rowSums。当应该一起分析持续8到16和16到32个周期的周期时,这很有用,如下图所示。毫不奇怪,小波滤波器产生与BK滤波器类似的结果,因为循环周期的上限在两者中相等,下限仅相差2。

    # 小波分解
    wavelet <- as.data.frame(mra(diff(load[,2]),J=5)) # Apply filter
    # Plot
    dat <- cbind(dat,data.frame("Wavelet"=c(NA,cumsum(rowSums(wavelet[,3:4])))))
    g <- melt(dat[,c(1,6,5)],id.vars="Time",na.rm=TRUE)
    levels(g[,2]) <- c("Wavelet","Baxter King")
    plot.cycles(g,"Wavelet vs. Baxter King")
    wff <- data.frame("Time"=dat[,"Time"],"Wavelet.Filter"=dat$Wavelet)
    waveletfilter = ggplot(data=wff, aes(x = Time, y = Wavelet.Filter )) + geom_hline(yintercept=0,colour="red") + geom_line(aes(color = Wavelet.Filter)) + labs(y="Wavelet Filter")
    waveletfilter
    

    Wavelet vs. Baxter King
    #经验模式分解(EMD)
    基于Huang等人。(1998)Kozic和Sever(2014)提出经验模式分解作为商业周期提取的另一种方法。该函数emd可以在EMD包中找到,并且需要不同的时间序列,边界条件和规则,该规则指定迭代过程在哪个点获得了足够令人满意的结果并且可以停止。该滤波器方法的结果与HP,BK和小波滤波器相比有所不同。每项研究的任务都是评估使用这种方法是否合理。

    # EMD经验模态分解
    emd <- as.data.frame(emd(xt=diff(load[,2]),boundary="wave",stoprule="type2")$imf)
    dat <- cbind(dat,data.frame("EMD"=c(NA,cumsum(rowSums(emd[,3:6])))))
    g <- melt(dat[,c(1,7,4)],id.vars="Time",na.rm=TRUE)
    levels(g[,2]) <- c("EMD","Hodrick Prescott")
    plot.cycles(g,"EMD vs. Hodrick Prescott")
    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
    

    EMD vs. Hodrick Prescott
    EMDfilter

    展开全文
  • 算法经验模态分解

    千次阅读 2018-12-21 09:18:11
    算法经验模态分解 2018年08月28日 20:24:51 kyang624823 阅读数:1204 简介 我们在实践中必须处理的所有真实过程都很复杂,作为一项原则,包含大量的分量。例如天气。在分析降水图时,我们应记住,它们表示...

    算法—经验模态分解

    2018年08月28日 20:24:51 kyang624823 阅读数:1204

    简介

    我们在实践中必须处理的所有真实过程都很复杂,作为一项原则,包含大量的分量。例如天气。在分析降水图时,我们应记住,它们表示各种各样的过程的互动,例如季节变换、全球变暖/变冷过程、洋流变化、气旋和反气旋的动态、排放到大气中的二氧化碳的量、太阳活动周期等,内容不胜枚举。 

    因此很难分析此类图,因为其分量在相互作用时会遮挡我们要识别的规律或让规律扭曲。这样会让人有理由出现将考虑的过程分解为单个分量并单独分析每个分量的想法。分析单个分量并研究它们已经为当前过程做出的贡献有助于我们更好地了解正在进行的过程,并提高预测可靠性。

    在讨论有关交易的各种信息时也不例外,包括依据大量不同因素形成的货币报价。这是很自然地期待预先分解为单个分量能够大大促进它们的进一步分析的原因。

    术语“分解”在形式上指将一个复合过程或复合材料分解为单独的组成部分。但是在与不同过程分析、信号分析、各种序列分析有关的很多领域中,此术语长期以来具有更为广阔的含义,通常不是指分解为实际的初始组成部分,而是指分解为在形成初始数据时实际上并不存在的某些函数。这些函数是在数据分解过程中人工形成的,但是尽管它们是“人工”的,它们也能更加深入地分析数据,有助于识别隐藏的形态。

    在市场分析中使用的大量方法或明或暗都可归于从分析过程中挑选某些分量的方法,即分解法。让我们简要地回顾一下这些方法。

     

    1. 分解

    在实践中,有很多各种各样的分解法可应用到考虑的给定序列。这些方法可能有不同的基本数学或经验方法,不同的复杂程度和不同的应用领域。 

    例如,即使一个基本市场分析在一定程度上也可被视为一种分解法。此分析处理一组直接影响市场状况的初始事件产生的影响。换言之,所分析的市场过程被暗中分解为若干组成该过程的事件。

    以后将不触及与基本分析有关的问题。我们假定有关过程的任何进一步的信息都不可用;我们拥有的仅是表示给定过程的行为的一个序列。

    可以用常见的方法将一个序列分解为几个组成部分,以之说明最简单的分解例子。例如,我们为任意货币对在图表上标绘移动平均线 (MA)。然后从初始序列中减去生成的曲线。这样一来,我们将得到初始序列的两个组成部分,MA 曲线和残数。相同的步骤,仅使用较长周期的移动平均线,在应用到获得的残数时,将产生三个组成部分 - 两条 MA 曲线和变换的残数。如您所见,可以使用任何可用的方式安排分解过程。要点在于此类过程的结果的属性。

    在著名的分解和频谱分析方法中,傅里叶变换特别值得在这里提及。傅里叶变换属于使用固定谐波基函数的正交变换类。傅里叶变换结果可表示为初始过程分解为具有固定频率和幅度的谐函数。注意,有两点对我们特别重要。

    第一点,变换始终依据一个固定的、预先设定的正交函数基进行。即变换基不取决于所变换的序列的性质。

    第二点,生成的谐分量的幅度和频率值是恒定的。即它们的值在整个初始序列中都保持不变。这意味着如果给定初始序列的性质在所考虑的区间内出现变化,则这种变化将不会在变换结果中反映出来。在此情况下,获得的结果将仅反映过程的某个平均状态,因为此变换依据初始数据的静态假设。

    为了避免与初始序列的非静态性有关的约束,我们可以将傅里叶变换转换为小波变换。小波变换,与傅里叶变换类似,以固定的函数基进行分解。与傅里叶变换不同,此基是预设的,即应选择在变换中使用的小波。

    此外,与傅里叶变换相比,从小波变换生成的每一个分量都有确定其随时间而变换的比例和水平的参数,这样解决了与所分析的过程可能具有的非静态性有关的问题。

    傅里叶变换和小波变换都被广泛认可,因为使用充分建立的数学技能和可用的有效实施算法。此外,两种变换都似乎特别通用,能够成功应用于不同的领域。 

    但是出于实践目的,最好使用不仅能够处理非静态过程,还能使用按初始数据确定的自适应变换基的变换。此类变换确实存在,以下将对其进行简要介绍,从而说明本文的主题。

     

    2. 经验模态分解

    经验模态分解 (EMD) 作为 希尔伯特-黄变换 (HHT) 的基础部分被提出来。可以这么说,希尔伯特-黄变换分为两个阶段进行。首先,使用 EMD 算法获得本质模态函数 (IMF)。

    接着,在第二阶段,通过对上一步获得的结果应用希尔伯特-黄变换得到初始序列的瞬时频率谱。HHT 能够获得非线性和非静态序列的瞬时频率谱。之后,可以使用经验模态分解处理这些序列。 

    然而,本文将不介绍使用希尔伯特变换标绘瞬时频率谱。我们将仅着重于 EMD 算法。

    与前面提及的傅里叶变换和小波变换相比,EMD 将任何给定数据分解为本质模态函数 (IMF),这些函数在分析上未被设定,而是由所分析的序列单独确定。在这种情况下,基函数从输入数据自适应地直接得出。从 EMD 生成的 IMF 应满足以下要求:

    1. IMF 极值的数量(最大值和最小值的数量之和)与零穿越的数量必须相等或最多相差 1;
    2. 在 IMF 的任意点,局部最大值定义的包络线的平均值和局部最小值定义的包络线的平均值应等于零。

    分解生成一系列的频率分阶 IMF 分量。每个后面的 IMF 包含比前面的 IMF 更小的频率振荡。尽管“频率”这一术语在运用到 IMF 时并不十分正确,但它可能最适合用于定义 IMF 的性质。本质在于尽管 IMF 是振荡性质,但其幅度和频率可以沿时间轴变化。

    单独依据描述对 EMD 算法执行结果进行可视化非常困难,因此让我们继续其软件实施,这样让我们有机会了解算法的特点。

     

    3. EMD 算法

    黄锷 (Norden E. Huang)提出的算法以产生序列的局部最大值和最小值所定义的平滑包络线,接着从初始序列减去这些包络线的平均值为基础。这要求识别所有局部极值,然后用三次样条曲线进一步将这些极值连接起来,以生成上下包络线。 

    标绘包络线的过程如图 1 所示:

     

    图 1. 标绘包络线和它们的平均值

    图 1. 描绘包络线和它们的平均值

     

    图 1 用细蓝线给出了所分析的序列。分别用红色和蓝色表示序列的最大值和最小值。用绿色给出包络线。

    依据两条包络线计算平均值,并在图 1 中以虚线表示。从初始序列中进一步减去这样计算出来的平均值。

    以上步骤生成所需经验函数的首次逼近提取。为了获得最终的 IMF,应再次识别新的最大值和最小值并重复以上所有步骤。此次重复的过程称为筛选。重复筛选过程,直到满足某个给定的停止标准。筛选停止标准的选择是影响最终分解结果的要点之一。我们将在迟些时候讨论这个问题。

    如果成功完成筛选过程,则我们将获得第一个 IMF。可以通过从原始信号减去先前提取的 IMF,再一次重复上述过程而获得下一 IMF。这样一直继续到提取完所有 IMF 为止。筛选过程通常在残数只包含不超过两个极值时停止。

    可以看到,描述的经验模态分解过程并不是基于严格的数学计算,但是真正基于经验,正如其名。尽管黄锷提出的以上算法简单明了,仍然有几点可被视为其弱点。

    有关此主题的不同文章提供了对其弱点的详细说明,以及对黄锷的算法进行现代改进的方式。本文将不着重于对此方法进行的可能现代改进,但是将简单地说明创建其软件实施的尝试。以下简单地介绍实施的特征。

     

     

    图 2 显示另一个例子,使用 USDJPY 每日报价的分解,序列长度为 100 个元素。可以看到,此序列的分解生成四个 IMF 提取和残数。

     

    图 2. USDJPY 每日报价序列的分解,其中 N=100。

    图 2. USDJPY 每日报价序列的分解,其中 N=100

     

    图 2 中的所有图表都以相同的刻度显示,这样能够评估每个提取的 IMF 做出的贡献。然而,这种绘图方式不能提供足够的清晰画面来查看每个 IMF 的特性。图 3 说明了相同的结果,但是对每个图表使用自动缩放模式。

     

    图 3. USDJPY 每日报价序列的分解,其中 N=100。自动缩放模式

    图 3. USDJPY 每日报价序列的分解,其中 N=100。自动缩放模式

    尽管图 3 没有显示单个分量的幅度的实际相关性,使用自动缩放模式能够对每一个图表进行更加详细的可视化。

     

    5. 有关所提议 EMD 算法实施的说明

    我要提醒您注意的第一样东西是用于识别初始序列的最大值和最小值的方法。在这个例子中,有两个选项可用。

    图 4 显示极值识别算法的执行结果。

    图 4. 极值的识别。第一个选项。

    图 4. 极值的识别。第一个选项。

    在要识别函数的最大值和最小值时,最常用的算法如下:

    1. 将序列的当前元素的值与前面和后面的值进行比较;
    2. 如果当前值大于前面的值和后面的值,则将其确定为函数的最大值;
    3. 如果当前值小于前面的值和后面的值,则将其确定为函数的最小值;

    如果具有明显定义极值的序列,最大值和最小值的识别没有任何困难。提供的算法运行得非常好。图 4 中图表的前一半说明了这种情形。然而,在序列的最接近的值相等的顶部,此算法就反应迟钝了。

    使用提供的算法,绝对不会识别出图 4 中的最后一个最大值和最后两个最小值。一方面,此结果是期待中的正确结果。但是另一方面,如果出现零穿越,在绘制振荡过程的类推时,这些极值会被忽略。矩形序列的顶部或者相等序列值的区段是否能被视为极值尚不清楚。 

    尽管如此,在实施 EMDecomp 类时用于识别极值的算法是以上算法的改进版。可以在图 4 中观察到其执行结果。此算法将具有相等序列值的区间识别为极值,并将极值点放在这些区间的中央。 

    用于识别最大值和最小值的算法,其执行结果显示在图 4 中,在确定分解循环应停止的点时,在 CEMDecomp 类中用于计算极值的数量。举例而言,如果提取的 IMF没有任何极值,则分解停止,并且此类 IMF 被抛弃。

    如果在描绘包络线时使用此识别算法,则举例而言,在输入序列采用如图 4 所示的形式时,生成的包络线会是两条平行的直线。筛选过程因而将无法变换输入序列,而这个输入序列将不适合分解为分量。 

    使用稍有区别的极值识别算法以描绘包络线可解决这个问题。

    图 5 说明使用备选的极值识别算法得到的结果。

    图 5. 极值的识别。第二个选项。

    图 5. 极值的识别。第二个选项。

     

    让我们仔细观察图 5。与图 4 不同,它以绿色显示既是最大值又是最小值的点。如果基于这些极值描绘包络线,则它们将不再是平行的直线,并且矩形序列的隐藏分量将可用于在筛选过程中进一步提取。位于本文末尾的 CEMDecomposition.zip 压缩文件中的一个测试案例能够很好地说明以上情形。

    很不幸,此方法不能解决与隐藏分量的提取有关的所有问题。例如,对于三角形序列,不能用这种方式提取隐藏分量。这一事实是这种 EMD 算法实施的弱点之一。或许可以通过切换到 CEEMD(Complementary Ensemble Empirical Mode Decomposition Method,补余经验模态分解法) 分解算法来解决这个困难;本文并不介绍该算法。

    除了与极值识别算法实施有关的特性以外,还应注意此类算法通常具有的末端影响问题。为了详细说明以上情形,让我们转到图 1。图 1 清晰地表明最大值被一个三次插值样条函数连接,作为上包络线。 

    这就是说,应为第一个最大值的左侧区段和最后一个最大值的右侧区段定义包络线。延长此包络线的方式类似于确定在其末尾附近提取的 IMF 的性质。本文不对末端影响修正的软件实施进行详细说明,只是简单地在这里指出这一事实,引起读者的注意。

    我们应进一步指出,提取的 IMF 的性质和数量能够并且将取决于为停止筛选循环而选择的方法。CEMDecomp 类使用表示当前 IMF 中的差异程度的比值(由最后一个筛选循环确定)的计算作为用于停止筛选过程的主要方法。 

    如果筛选对一个未知 IMF 几乎没有作用,则筛选过程停止,并且 IMF 被视为已经生成。默认情况下,在类的构造函数中设置一个用于确定 IMF 提取精确度的极限值。设置默认的极限值之后,筛选迭代次数有时可达到 200 甚至 300.在有关此主题的文章中,很多作者对使用如此之大的筛选迭代次数提出了警告。尽管如此,还是决定在这种 EMD 算法实施中使用这个默认极限值。

    这种 EMD 算法实施能够使用其他停止标准。为此,在调用 Decomp() 方法之前,应将变量 FixedIter 设置为 1。在这种情况下,所有 IMF 都将在 10 次筛选迭代内被提取出来。并且很容易看到,与默认方法相比,使用这个停止标准得到的分解结果有一点区别。

     

    6. EMD 算法的应用

    因为 EMD 算法最初是希尔伯特-黄变换的一部分,序列的瞬时频率谱计算可用作示范此算法的应用的一个例子。这涉及对使用 EMD 提取的 IMF 分量进行希尔伯特-黄变换。然而,本文并不介绍这个过程。

    除了计算频率谱以外,EMD 算法还可用于平滑序列。 

    图 6 显示此类平滑的一个例子。

     

    图 6. 输入序列的平滑

    图 6. 输入序列的平滑

     

    选择包含 100 个“开盘”价的任意 USDCHF 每日报价片断进行平滑。在分解过程中,得到四个 IMF 和残数。除了第一个以外,所有 IMF 被进一步添加到残数。 

    因此,找到的最高频率分量被排除在输入序列以外。如果我们在将它们加起来时放弃前两个分量,则生成的曲线将会更加平滑。

    EMD 应用的另一个例子是基于从输入序列提取的 IMF 生成预测。要生成预测,可以使用任意外推器,借此为每个 IMF 和残数单独生成预测。 

    然后将用这种方式生成的预测加起来,为输入序列生成需要的预测结果。考虑到单个 IMF 的振荡性质,我们可以假定要生成预测,使用考虑了预测序列的周期行为的外推器应该是合理的。 

    在我们的情形中,我们将回顾一个更为简单的外推器的运行例子,其中使用 10 步前进线性外推生成每个 IMF 的预测。图 7 显示了此预测的结果。

     

    图 7. 为 USDCHF,H4 报价生成预测

    图 7. 为 USDCHF,H4 报价生成预测

     

    应该指出,在生成预测时,可以放弃一个或多个最高频率的分量。因此,高频噪声对预测的影响可得到抑制。图 7 说明了排除第一个 IMF 的预测的结果。在本例中,没有评估这种方法的预测能力。在这里没有提供以经验模态分解为基础的预测方法的详细分析,因为这个主题不在本文的讨论范围之内。

    我们也不得不提及趋势剔除。在使用 EMD 得到单个的序列分量之后,可以开发一个非常灵活的算法来进行趋势剔除。分解的残数或添加到一个或多个最后提取的 IMF 的残数可被当作一个趋势。创建趋势线所涉及的 IMF 以及残数的数量视在剔除趋势之后需要在序列中保留的低频分量的数量而有所不同。 

    因此,要剔除趋势,除了最后一个或几个分量以外,将所有作为分解的结果提取的 IMF 加在一起就足够了。此过程可以方便地与对获得的结果进行平滑结合在一起,如果已经从将分量加在一起的过程中排除了最高频率分量的话。图 8 显示了使用以上技术剔除趋势的例子。

     

    图 8. 与平滑结合在一起的趋势剔除

    图 8. 与平滑结合在一起的趋势剔除

     

    将 EURUSD 每日报价的一个序列作为初始数据。在分解之后,将所有提取的分量加在一起,但不包括分解的残数,第一个和最后一个 IMF。这样一来,不仅仅是剔除趋势,还对生成的曲线进行一定程度的平滑。

    经验模态分解法的应用领域当然不限于本文给出的简单例子。但是因为本文更加专注于 EMD 方法的实施问题,而不是其应用,让我们考虑一下以下例子。

    说明使用在 CEMDecomp.mqh 中设定的参数获得的分解结果的图 9 可作为这种 EMD 方法实施的另一个功能说明。这个例子以使用 XAUUSD H4 报价为基础。序列长度为 150 个元素。

     

    图 9. 使用 XAUUSD H4 报价的分解例子

    图 9. 使用 XAUUSD H4 报价的分解例子

    在图 9 中,对每个分量应用了自动缩放。

     

    总结

    记住,经验模态分解法以及希尔伯特-黄变换用于分析非静态和非线性过程产生的数据。这并不意味着此方法不能应用到线性和静态序列。

    本文的开头简单提及了在分解算法中使用的几个方法。并且指出这些算法中的大部分将一个序列分解为若干分量,这些分量事实上并不代表实际构成所考虑的序列的初始过程。 

    这些分量是以某种形式合成的;它们的提取仅帮助更好地了解输入序列的结构,并且在很多情形中能够促进其分析。EMD 方法也不是例外。您绝对不应该认为使用此方法获得的分量反映了最初从中形成初始分析数据的实际物理过程。

    本文提出的实施可能需要进一步测试和改进,因为很难将其视为一个理想的实施。

    展开全文
  • 经验模态分解 及其衍生算法

    千次阅读 2019-01-03 22:17:38
    原始经验模态分解是黄锷(N. E. Huang)在美国国家宇航局与其他人于1998年创造性地提出的一种新型自适应信号时频处理方法,特别适用于非线性非平稳信号的分析处理。 EMD 介绍. 经验模态分解法(EMD)是将信号分解成...

    原始经验模态分解是黄锷(N. E. Huang)在美国国家宇航局与其他人于1998年创造性地提出的一种新型自适应信号时频处理方法,特别适用于非线性非平稳信号的分析处理。

    1. EMD 介绍.
      经验模态分解法(EMD)是将信号分解成一些列特诊时间尺度(IMF)分量,使得各IMF分量是窄带信号,即IMF分量必须满足下面两个条件:在整个信号长度上,极值点和过零点的数目必须相等或者至多只相差一个;在任意时刻,由极大值点定义的上包络线和由极小值点定义的下包络线的平均值为零,即信号的上下包络线关于时间轴对称。简单的说就是将一个复杂信号分解成多个简单信号的过程。同小波变换相比,EMD方法是完全根据信号数据本身来确定需要分解出多少个IMF,因此更加的具有自适应性。Huang在1998年提出HHT变换后,EMD作为HHT的核心组成部分,引起多研究学者的关注和深入研究,并取得了进展。

    2. EMD方法的实现
      EMD方法是基于如下假设基础上的:
      (1) 信号至少有两个极值点,一个极大值和一个极小值;
      (2) 特征时间尺度通过两个极值点之间的时间定义;
      (3) 若数据缺乏极值点但有形变点,则可通过数据微分一次或几次获得极值点,然后再通过积分来获得分解结果。
      其算法实现描述为:

    3. EMD 算法存在的局限性
      1).混频现象
      同一个分量中包含不同的频率,或同一个频率出现在不止一个分量中。(待完善
      2).边缘效应
      EMD方 法 通 过 多 次 的 筛 分 过 程 (sifting process)来逐个分解 IMF.在每一次的筛分过程中 ,要根据信号的上 、下包络来计算信号的局部平均值 ; 上 、下包络是由信号的局部极大值和极小值通过样条插值算法给出 .由于信号两端不可能同时处于极大值和极小值 , 因此上 、下包络在数据序列的两端不可避免地会出现发散现象 ,给筛分过程引入误差 ,并且这种发散的结果会随着筛分过程的不断进行 ,逐渐向内 “污染 ”整个数据序列 ,使得所得结果严重失
      真 .对于较长的数据序列来讲 , 可以根据极值点的情况不断抛弃两端的数据来保证所得到的包络线失真度最小 .但对于短数据序列来讲 ,这样的操作就变得完全不可行 。

    4. 衍生或改进算法
      针对原始EMD 的局限性和确定不同的学者提出了不同的处理方法:
      1).混频现象–> EEMD(Wu, Z., Huang, N.E., 2004. Ensemble Empirical Mode Decomposition: a Noise-assisted Data Analysis Method. Centre for Ocean-Land-Atmosphere Studies. Technical Report, vol. 193, p. 51. http://www.iges.org/pubs/tech.html.

      Ensemble Empirical Mode Decomposition(集合经验模态分解)(Wu and Huang, 2009),是EMD(经验模态分解)(Huang et al. 1998; Huang and Wu, 2008)的改进算法,有效的解决了EMD的混频现象。
      2).边缘效应–> 次端点镜像延拓法(张西良, 万学功, 李萍萍, 张建, and 徐云峰. (2008). 动态称量经验模态分解数据处理方法. 江苏大学学报(自然科学版), (06):461-464.

    5. 应用范围
      去除噪声,消除趋势项,辅助预测(原油价格预测,风力预测), 尺度分析;
      1.戴桂平, 张愉, 谢储晖. 基于EMD时间尺度的去噪方法研究[J]. 苏州市职业大学学报, 2007, 18(2):58-60.
      2.赵宝新, 张保成, 赵鹏飞, 张戌. EMD在非平稳随机信号消除趋势项中的研究与应用. 机械制造与自动化. 2009:85-87.
      3.Zhang X, Lai KK, Wang S. A new approach for crude oil price analysis based on Empirical Mode Decomposition. Energy Economics. 2008;30:905-918.
      4.Liu H, Chen C, Tian H, Li Y. A hybrid model for wind speed prediction using empirical mode decomposition and artificial neural networks. RENEW ENERG. 2012;48:545-556.
      5.An X, Jiang D, Zhao M, Liu C. Short-term prediction of wind power using EMD and chaotic theory. COMMUN NONLINEAR SCI. 2012;17:1036-1042.
      6.王兵, 李晓东. 基于EEMD分解的欧洲温度序列的多尺度分析. 北京大学学报(自然科学版). 2011:627-635.

    6. 其他
      相关的算法 包括动态模态分解(DMD), 变分分解(VMD)。。。

    展开全文
  • EMD最初由新加坡南洋理工的黄教授首先开发,但由于存在模态混叠和端点效应现象,法国的Handrin等人用EMD对白噪声分解后的结果进行统计,提出了基于噪声辅助分析的改进EMD方法,即集合经验模态分解(EEMD)。...

    EMD和EEMD是两种常规的数据分解方法;EMD最初由新加坡南洋理工的黄教授首先开发,但由于存在模态混叠和端点效应现象,法国的Handrin等人用EMD对白噪声分解后的结果进行统计,提出了基于噪声辅助分析的改进EMD方法,即集合经验模态分解(EEMD)。

    由于两种方法提出的时间较早,这里不做具体的分析介绍,读者可自行参看相关文献。

    直接上代码

    unction allmode=eemd(Y,Nstd,NE)
    xsize=length(Y);
    dd=1:1:xsize;
    Ystd=std(Y);
    Y=Y/Ystd;
    
    TNM=fix(log2(xsize))-1;
    TNM2=TNM+2;
    for kk=1:1:TNM2, 
        for ii=1:1:xsize,
            allmode(ii,kk)=0.0;
        end
    end
    
    for iii=1:1:NE,
        for i=1:xsize,
            temp=randn(1,1)*Nstd;
            X1(i)=Y(i)+temp;
        end
    
        for jj=1:1:xsize,
            mode(jj,1) = Y(jj);
        end
        
        xorigin = X1;
        xend = xorigin;
        
        nmode = 1;
        while nmode <= TNM,
            xstart = xend;
            iter = 1;
       
            while iter<=10,
                [spmax, spmin, flag]=extrema(xstart);
                upper= spline(spmax(:,1),spmax(:,2),dd);
                lower= spline(spmin(:,1),spmin(:,2),dd);
                mean_ul = (upper + lower)/2;
                xstart = xstart - mean_ul;
                iter = iter +1;
            end
            xend = xend - xstart;
       
       	    nmode=nmode+1;
            
            for jj=1:1:xsize,
                mode(jj,nmode) = xstart(jj);
            end
        end
       
        for jj=1:1:xsize,
            mode(jj,nmode+1)=xend(jj);
        end
       
        allmode=allmode+mode;
        
    end
    
    allmode=allmode/NE;
    allmode=allmode*Ystd;

    读入EXCEL数据,根据子程序计算。

    [z]=xlsread('C:\Users\ljw\Desktop\计算\单独30min 数据\30min.xlsx') ;%读入数据
    d=eemd(z,0,1);%根据子程序进行分解

    EEMD程序中有三个参数(Y、Nstd、NE);Y为输入数据、Nstd/NE可根据数据类型和参考文献确定。值得注意的是,EEMD是在EMD的基础上开发出来的,当EEMD中的参数NSTD为0,NE为1时,程序为EMD

     

    展开全文
  • 经验模态分解算法

    2012-05-15 15:18:33
    经验模态分解算法
  • 典型相关分析的多变量版本,也是联合盲源分离算法的典型算法之一
  • 为了检测被强噪声淹没的目标信号,提出了一种新的基于经验模态分解(EMD)的去噪算法。该算法经验模态分解得到的第一个固有模态函数(IMF)循环移位,得到功率保持不变的噪声样本函数。将多个噪声样本函数叠加后,与重构...
  • 量化择时:基于经验模态分解的希尔伯特-黄变换 part2部分是算法的介绍,抛开代码部分,其实就是所有人都能看得懂字面解释 Part2算法 在了解了基础的数理知识和学习了将实信号转换为复信号的处理方法之后,掌握的...
  • 上次搞定了R语言对一列的值做emd然后输出所有imf的组合图,下面尝试处理多列数值。 #绘制所有省份最高值的最后一个IMF # 读取数据 load <- data.frame(read.csv("最高.csv")) # 取对数 length(load) load[,2:...
  • 然后使用改进的二次二维经验模态分解算法进行图像去噪,最后利用R-L算法实现对湍流退化图像的复原。通过搭建光学实验系统,对实际拍摄的湍流退化图像进行了复原实验。结果表明,该算法能够有效减弱噪声放大现象,...
  • 多元经验模态分解代码,在EMD基础上发展而来的可同时分解多元数据
  • 传统的经验模态分解,适合初级的研究生学习故障诊断,信号处理方式。
  • 经验模态分解CEEMDAN

    2018-08-14 10:12:25
    经验模态分EMD的改进CEEMDAN方法源代码,可以直接下载后调用
  • 1、EMD介绍       ...这可以与一些时空分析方法,如傅里叶变换和小波分解,相比拟。与这些方法类似,EMD并不基于物理(原理)。相反,这些模态可能提供了在这些数据中...
  • 一、经验模态分解(Empirical Mode Decomposition, EMD) 目的 EMD是由 NE. Huang 等人提出的一种将信号分解成特征模态的方法。它的优点是不会运用任何已经定义好的函数作为基底,而是根据所分析的信号而自适应...
  • 经验模态分解是2000年以来以傅立叶变换为基础的线性和稳态频谱分析的一个重大突破,它是依据信号自身的时间尺度特征对信号进行分解,无需预先设定任何基函数,这一点与建立在先验性的谐波基函数和小波基函数上的傅立...
  • 本文件提供处理信号的常用算法经验模态分解方法,对于信号的处理具有很好的处理效果
  • 经验模态分解

    2017-11-21 16:43:03
    经验模态分解及改进算法,可以用于故障诊断中对信号进行分解。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,542
精华内容 616
关键字:

经验模态分解算法