python计算EEG信号的:近似熵、样本熵、模糊熵

从原理出发利用python计算EEG信号的近似熵、样本熵和模糊熵。具体的原理我就不在这里说了,网上有很多讲解得很好的,一搜就有很多。我这里就给大家展示一下python的实现过程和结果,代码纯手敲,还没有对比工具箱的计算结果,不过应该可以帮助你更好的理解这几个熵的计算过程。因为我看原理公式的时候总是看不明白,通过代码感觉会更清晰。希望对你也是一样。若有错误,欢迎指出。

在这里插入图片描述

一、近似熵

def ApEn(x, m, r):                                             # 2. m:模式维数, r:相似容限
    N = len(x)                                                      # 1. 信号总长N
    x = np.array(x)
    if x.ndim != 1:
        raise ValueError("x的维度不是一维")
    if N < m + 1:
        raise ValueError("len(x)小于m+1")  
        
    phi = []
    for temp in range(2):  # 7.	将窗 m 增长为 m+1: temp = 0:m ; temp = 1: m+1
        # 3. 以m为窗,将时间序列分为k = n-m+1个序列
        X = []
        m = m+temp
        for i in range(N + 1 - m):
            X.append(x[i:i+m])
        X = np.array(X)
        
        # 4. 计算每个i与所有j之间的绝对值距离,获取统计个数:N_m(i)【count】
        C = []
        for index1, i in enumerate(X):
            count = 0
            for index2, j in enumerate(X):
                if index1 != index2:
                    if np.max(np.abs(i-j)) <= r:
                        count += 1
            # 5. 获取 C
            C.append(count/(N-m+1))
        # 处理C为0的值,替换为一个非零的很小的数,以防取对数时报错
        C = np.array(C)
        C = np.where(C == 0, 1e-10, C)
        
        # 6. 对每个C取自然对数,获取 Φ
        phi.append(np.sum(np.log(C))/(N-m+1))
        
    # 8. 获取近似熵
    apEn = phi[0] - phi[1]
    return apEn

二、样本熵

def SampEn(x, m, r):
    N = len(x)                                                      # 1. 信号总长N
    x = np.array(x)
    if x.ndim != 1:
        raise ValueError("x的维度不是一维")
    if N < m + 1:
        raise ValueError("len(x)小于m+1")  
        
    AB = []
    for temp in range(2):  # 7.	将窗 m 增长为 m+1: temp = 0:m ; temp = 1: m+1
        # 3. 以m为窗,将时间序列分为k = n-m+1个序列
        X = []
        m = m+temp
        for i in range(N + 1 - m):
            X.append(x[i:i+m])
        X = np.array(X)
        
        # 4. 计算每个i与所有j之间的绝对值距离,统计距离d小于r的个数:N_m(i)【count】
        C = []
        for index1, i in enumerate(X):
            count = 0
            for index2, j in enumerate(X):
                if index1 != index2:
                    if np.max(np.abs(i-j)) <= r:
                        count += 1
            # 5. 获取每个i的 C
            C.append(count/(N-m+1))
        # 处理C为0的值,替换为一个非零的很小的数,以防取对数时报错
        C = np.array(C)
        C = np.where(C == 0, 1e-10, C)
        
        # 6. 求所有i得平均值
        AB.append(np.sum(C)/(N-m+1))
        
    # 8. 获取样本熵
    SE = np.log(AB[0]) - np.log(AB[1])
    return SE

三、模糊熵

def FuzzyEntopy(x, m, r, n=2):
    x = np.array(x)
    if x.ndim != 1:
        raise ValueError("x的维度不是一维")
    if len(x) < m + 1:
        raise ValueError("len(x)小于m+1")  
    entropy = 0
    
    for temp in range(2):  # 5.	将窗 m 增长为 m+1: temp = 0:m ; temp = 1: m+1
        # 2. 以m为窗,将时间序列分为k = n-m+1个序列
        X = []
        for i in range(len(x) + 1 - (m  + temp)):
            X.append(x[i:i+m+temp])
        X = np.array(X)
        D_value = []
        # 3. 计算绝对距离
        for index1, i in enumerate(X):
            d = []
            for index2, j in enumerate(X):
                if index1 != index2:
                    d.append(np.max(np.abs(i-j)))
            D_value.append(d)
        # 4. 计算模糊隶属度D
        D = np.exp(-np.power(D_value, n)/r)
        Lm = np.average(D.ravel())
        # 6. 计算模糊熵
        entropy = np.abs(entropy) - np.log(Lm)
    return entropy

在这里插入图片描述

四、结果

请添加图片描述
请添加图片描述
请添加图片描述

五、完整代码

https://github.com/weisihong9/ApEn_SaEn_FuEn.git

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值