• 【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,包络熵,散布熵,究竟实现了什么?(第五篇)——“包络熵”及其MATLAB实现


    今天讲包络熵,之前用了几篇文章分别讲述了功率谱熵、奇异谱熵、能量熵、近似熵、样本熵、模糊熵、排列熵这7种类型的熵:

    Mr.看海:【熵与特征提取】基于“信息熵”的特征指标及其MATLAB代码实现(功率谱熵、奇异谱熵、能量熵)

    Mr.看海:【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,究竟实现了什么?(第一篇)——“近似熵”及其MATLAB实现

    Mr.看海:【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,究竟实现了什么?(第二篇)——“样本熵”及其MATLAB实现

    Mr.看海:【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,究竟实现了什么?(第三篇)——“模糊熵”及其MATLAB实现

    Mr.看海:【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,究竟实现了什么?(第四篇)——“排列熵”及其MATLAB实现

    今天要讲的包络熵,是比较简单和直观的,不过很多论文里都有用到,尤其是在做寻优算法时,包络熵经常被用来作为适应度函数。

    一、包络熵

    我们知道,之前讲过的熵都属于信息熵的范畴,但是我们在求一段数据的信息熵时,鲜有直接将原始数据带入信息熵公式的情况,而是首先将数据预处理,比如求功率谱、求奇异谱等等,然后对这些谱序列求信息熵。

    包络熵也是采取的类似理念。包络熵的基本思路是对希尔伯特变换后得到包络信号,对包络值归一化之后即可带入信息熵公式求得包络熵。

    以上步骤如此简单,没有过多需要说明的,如果有同学对信息熵的概念还不太了解,可以看这里:【熵与特征提取】基于“信息熵”的特征指标及其MATLAB代码实现(功率谱熵、奇异谱熵、能量熵)

    至于希尔伯特的概念,则可以看我之前写的这篇:Mr.看海:希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现

    此图仅为装饰,不用细看哈

    2.MATLAB代码实现

    包络熵的MATLAB实现还是比较简单的,有一定代码基础的同学应该可以搞定。不过按照惯例我也将该方法的函数代码进行了编写,我将其命名为kEnvelopeEntropy。

    为了特征提取代码的易用性,笔者对一系列熵特征提取进行了封装,包括上边添加注释的代码都集中到一起。由于搞科研写论文时,对特征提取的需要往往是集中性的、多种类的、需求各异的,所以我把之前介绍过的熵特征值和后边将会降到的集中熵特征进行了打包:

    熵特征值共9个——功率谱熵、奇异谱熵、能量熵、近似熵、样本熵、排列熵、模糊熵、 包络熵、散布熵

    以上9种全都集中到一个封装函数里,实现一行代码完成特征提取。

    比如提取数据“包络熵”就可以像这样写:

    fea = genFeatureEn(data,{'enveEn'}) %对data求包络熵

    如果提取数据“功率谱熵、奇异谱熵、能量熵、近似熵、样本熵、排列熵、模糊熵、包络熵、散布熵”这全部9种特征,就可以这样写:

    1. fea =genFeatureEn(data,{'psdE','svdpE','eeE','ApEn', 'SpEn','FuzzyEn','PeEn','enveEn','DE'});
    2. %调用genFeature函数,完成特征提取,算出的特征值会保存在fea变量里

    也就是说需要提取哪个特征,在函数中直接指定就可以了。输出的fea变量里就会得到相应的这些特征值,顺序也是与输入的排序保持一致的。

    此外,针对同学们写论文要水图(哦不,科研)的需求,程序运行完后还可以画图这样的柱状图:

    如果输入一维数据,得到的是柱状图

    函数也可以输入二维数据,如果输入二维数据,则就是逐行求取熵特征。比如下图,导入的是一个有三行数据的二维数组的绘图结果:

    如果输入的是二维数据,得到的是折线图,横坐标是数据组数

    这个函数的介绍如下:

    1. fea = genFeatureEn(Data,featureNamesCell,option); %调用genFeature函数,完成特征提取,算出的特征值会保存在fea变量里,
    2. %fea变量的长度和featureNamesCell中指定的特征量一致,且顺序一一对应
    3. %程序运行完成后,在MATLAB的工作区,双击fea变量,可以查看求得的具体数值
    4. % function fea = genFeatureEn(data,featureNamesCell,options)
    5. % 熵相关算法的信号特征提取函数
    6. % 输入:
    7. % data:待特征提取的时域信号,可以是二维数据,维度为m*n,其中m为数据组数,n为每组数据的长度。即每行数据为一组。行列方向不可出错
    8. % options:其他设置,使用结构体的方式导入。目前可设置变量包括:
    9. % -svdpEn:即奇异值的窗口长度。
    10. % -Apdim:近似熵参数,Apdim为近似熵的模式维度
    11. % -Apr:近似熵参数,Apr为近似熵的阈值
    12. % -Spdim:样本熵参数,Spdim为样本熵的模式维度
    13. % -Spr:Spr为样本熵的阈值
    14. % -Fuzdim:模糊熵参数,Fuzdim为模糊熵模式维度
    15. % -Fuzr:模糊熵参数,Fuzr为模糊熵的阈值
    16. % -Fuzn:模糊熵参数,Fuzn为模糊熵权重
    17. % -Pedim:排列熵参数,Pedim为排列熵模式维度
    18. % -Pet:排列熵参数,Pet为排列熵的时间延迟
    19. % -DEm: 散布熵参数,DEm为散布熵模式维度
    20. % -DEc: 散布熵参数,DEc为散布熵类别数(通常建议取6)
    21. % -DEd: 散布熵参数,DEd为散布熵时间延迟(通常建议取1)
    22. % -fs:采样频率,采样频率即每秒钟采集的数据点数,按照实际情况设置,该参数目前在包络熵特征采集中用到
    23. % featureNamesCell:拟进行特征提取的特征名称,该变量为cell类型,其中包含的特征名称为字符串,特征名称需要在下边列表中:
    24. % 目前支持的特征(2024.4.23,共9种):
    25. % psdE:功率谱熵
    26. % svdpE:奇异谱熵
    27. % eeE:能量熵
    28. % ApEn:近似熵
    29. % SpEn:样本熵
    30. % FuzzyEn:模糊熵
    31. % PeEn:排列熵
    32. % enveEn:包络熵
    33. % DE:散布熵
    34. %
    35. % 输出:
    36. % fea:数据data的特征值数组,其特征值顺序与featureNamesCell一一对应

    需要上边这个函数文件以及测试代码的同学,可以在公众号 khscience(看海的城堡)中回复“特征提取”获取。

    3.其他:时域、频域特征提取的MATLAB代码实现

    除了上述熵特征的提取,笔者还对之前文章中讲到过的时域和频域特征进行了代码实现,具体包括:

    有量纲特征值8个——最大值、最小值、峰峰值、均值、方差、标准差、均方值、均方根值(RMS) 无量纲特征值6个——峭度、偏度、波形因子、峰值因子、脉冲因子、裕度因子 频域特征值5个——重心频率、均方频率、均方根频率、频率方差、频率标准差 谱峭度特征4个——谱峭度的均值、谱峭度的标准差、谱峭度的偏度、谱峭度的峭度

    以上23种全都集中到一个封装函数里,实现一行代码完成特征提取。

    比如提取数据“重心频率”就可以像这样写:

    fea = genFeatureTF(data,{'FC'}) %对data数据求重心频率

    如果提取数据“最大值、最小值、峰峰值、均值、方差、标准差、均方值...”这全部22种特征,就可以这样写:

    1. fea =genFeatureTF(data,{'max','min','mean','peak','arv','var','std','kurtosis',...
    2. 'skewness','rms','waveformF','peakF','impulseF','clearanceF',...
    3. 'FC','MSF','RMSF','VF','RVF',...
    4. 'SKMean','SKStd','SKSkewness','SKKurtosis'}); %调用genFeature函数,完成特征提取,算出的特征值会保存在fea变量里

    也就是说需要提取哪个特征,在函数中直接指定就可以了。输出的fea变量里就会得到相应的这些特征值,顺序也是与输入的排序保持一致的。

    这个函数的介绍如下:

    1. function fea = genFeatureTF(data,fs,featureNamesCell)
    2. % 时域、频域相关算法的信号特征提取函数
    3. % 输入:
    4. % data:待特征提取的时域信号,可以是二维数据,维度为m*n,其中m为数据组数,n为每组数据的长度。即每行数据为一组。行列方向不可出错
    5. % fs:采样频率,如果不提取频域特征,fs值可以设置为1
    6. % featureNamesCell:拟进行特征提取的特征名称,该变量为cell类型,其中包含的特征名称为字符串,特征名称需要在下边列表中:
    7. % 目前支持的特征(2022.5.23,共23种):
    8. % max :最大值
    9. % min :最小值
    10. % mean :平均值
    11. % peak :峰峰值
    12. % arv :整流平均值
    13. % var :方差
    14. % std :标准差
    15. % kurtosis :峭度
    16. % skewness :偏度
    17. % rms :均方根
    18. % waveformF :波形因子
    19. % peakF :峰值因子
    20. % impulseF :脉冲因子
    21. % clearanceF:裕度因子
    22. % FC:重心频率
    23. % MSF:均方频率
    24. % RMSF:均方根频率
    25. % VF:频率方差
    26. % RVF:频率标准差
    27. % SKMean:谱峭度的均值
    28. % SKStd:谱峭度的标准差
    29. % SKSkewness:谱峭度的偏度
    30. % SKKurtosis:谱峭度的峭度
    31. %
    32. % 输出:
    33. % fea:数据data的特征值数组,其特征值顺序与featureNamesCell一一对应

    需要上边这个函数文件以及测试代码的同学,可以在公众号 khscience(看海的城堡)中同样回复“特征提取”获取。

    上述2个函数(熵特征提取函数“genFeatureEn”和时频特征提取函数“genFeatureTF”)会持续更新,有哪些想要加进去的特征指标,同学们可以在评论区留言,笔者会考虑纳入到这个“特征提取指标全家桶”中。

  • 相关阅读:
    Stream常用操作以及原理探索
    python闭包与装饰器
    11 【Teleport CSS功能】
    Python使用总结之PyInstaller常用参数详解
    石子合并终极版 (GarsiaWachs算法) [o(n*n)] 板子
    Go基础12-理解Go语言表达式的求值顺序
    【sfu】network线程和主线程
    Web2.0架构与Web3.0架构
    Vue详解及综合案例
    微信、支付宝修改步数【小米运动】
  • 原文地址:https://blog.csdn.net/fengzhuqiaoqiu/article/details/138172149