浅记一下四个特征,方便以后查阅。
DE特征、PID特征、PSD特征、时频图
DE特征(Differential Entropy) 、PID特征(Permutation Index Dimension) 和 PSD特征(Power Spectral Density) 是在脑电信号分析中用于描述信号复杂度和结构的信息理论特征。这些特征通常用于脑电信号分类、预测任务或神经网络模型中,特别是在脑机接口(BCI)和情绪识别等领域。
1. DE特征(Differential Entropy)
DE(Differential Entropy) 是熵的一种度量方式,用来描述信号的不确定性或信息量。在脑电信号分析中,DE特征用于量化信号的复杂度。与传统的熵(如香农熵)不同,DE考虑了信号的动态变化,它是基于信号的概率分布来评估信号的复杂性。
-
定义:DE是信号在特定频带(例如,α波、β波等)上的差异性,通常基于信号的功率谱估计来计算。
-
计算方法:通常,通过对信号的功率谱进行傅里叶变换或小波变换,然后计算信号的差分熵。
DE的公式:
H ( x ) = − ∫ p ( x ) log p ( x ) d x H(x) = - \int p(x) \log p(x) dx H(x)=−∫p(x)logp(x)dx
其中, p ( x ) p(x) p(x) 是信号 x x x 的概率密度函数, H ( x ) H(x) H(x) 就是信号的差分熵。
DE特征的计算步骤:
- 进行傅里叶变换或小波变换,得到信号的频谱。
- 计算信号在不同频段(如 α 波、β 波、θ 波)的功率谱。
- 计算这些频段的差分熵,得到 DE 特征。
Python 实现:
import numpy as np
import scipy.signal as signal
from scipy.stats import entropy
def differential_entropy(data, fs=512):
"""
计算单通道脑电信号的差分熵(DE特征)。
参数:
data: 单通道EEG信号(NumPy数组)
fs: 采样率(Hz)
返回:
DE值
"""
# 计算信号的功率谱密度(PSD)
f, Pxx = signal.welch(data, fs, nperseg=1024)
# 对功率谱密度取对数后计算熵
psd_log = np.log(Pxx + 1e-10) # 防止log(0)的出现
de = entropy(psd_log)
return de
# 示例:假设有一个脑电信号 `eeg_signal` 和采样率 `fs`
eeg_signal = np.random.randn(1024) # 这里使用随机信号代替
fs = 512 # 假设采样率为512Hz
de_value = differential_entropy(eeg_signal, fs)
print(f"Differential Entropy (DE): {
de_value}")
代码解释
scipy.signal.welch
:计算信号的功率谱密度(PSD),这可以看作是信号的频谱分布。entropy
:计算信号的熵,基于其功率谱的对数。- DE特征:最终通过对功率谱密度的对数进行熵计算得到 DE 特征。
2. PID特征(Permutation Index Dimension)
PID(Permutation Index Dimension) 是一种基于排列的复杂度度量方法。它可以用于描述时间序列的动态结构。PID特征通过比较信号在不同时间点的排列顺序来反映信号的动态行为。
-
定义:PID特征基于信号的排列模式,考虑到信号的局部结构和动态。它通过检测信号的排列模式是否有规则性来量化信号的复杂性。
-
计算方法:PID的计算通常依赖于对信号的局部子序列的排列模式进行分析。通过比较子序列之间的排列模式,计算出信号的维度或复杂度。
Python 实现:
我们可以使用一个简单的 PID 计算方法,基于排列模式(permutation)来计算复杂度。
import numpy as np
from itertools import permutations
def permutation_index_dimension(data, m=3, tau=1):
"""
计算脑电信号的排列指数维度(PID特征)。
参数:
data: 单通道EEG信号(NumPy数组)
m: 选择的嵌入维度(通常为3)
tau: 时间延迟
返回:
PID值
"""
# 创建嵌入向量
embedded = np.array([data[i:i+m*tau:tau] for i in range(len(data) - m*tau)])
# 计算排列模式
perm_indices = []
for vector in embedded:
perm_indices.append(np.argsort(vector)) # 获取每个向量的排列顺序
# 计算PID:通过排列模式的维度来量化复杂度
unique_perms = set(tuple(perm) for perm in perm_indices)
pid = len(unique_perms) # 不同排列的数量
return pid
# 示例:假设有一个脑电信号 `eeg_signal`
eeg_signal = np.random.randn(1024) # 这里使用随机信号代替
pid_value = permutation_index_dimension(eeg_signal)
print(f"Permutation Index Dimension (PID): {
pid_value}")
代码解释
embedded
:构造信号的嵌入向量,通常通过选择信号的子序列并加入时间延迟(tau)来生成。np.argsort(vector)
:对信号的子序列进行排序,得到每个子序列的排列模式。unique_perms
:计算所有排列模式的数量,不同的排列模式代表信号的不同结构。- PID特征:最终,通过计算不同排列模式的数量来得到信号的复杂度。
3. PSD特征(Power Spectral Density)
功率谱密度(Power Spectral Density, PSD) 是信号能量(或功率