SEED 数据集特征提取代码解析:从差分熵到 8x9x5 矩阵
这段代码的功能是将数据文件中的信号进行处理,提取特征和标签,并保存到文件中。/n/n首先导入所需的库:/n/npython/nimport os/nimport sys/nimport math/nimport numpy as np/nimport scipy.io as sio/nfrom sklearn import preprocessing/nfrom scipy.signal import butter, lfilter/nfrom scipy.io import loadmat/n/n/n定义了一个函数decompose(file, name),用于对单个数据文件进行处理。函数的参数file为数据文件的路径,name为数据文件的简短名称。/n/npython/ndef decompose(file, name):/n data = loadmat(file) # 加载数据文件/n frequency = 200 # 采样频率/n/n decomposed_de = np.empty([0, 62, 5]) # 存储分解后的特征/n label = np.array([]) # 存储标签/n all_label = [1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 0, 1, -1] # 所有标签的列表/n/n for trial in range(15): # 遍历15个试验/n tmp_trial_signal = data[name + '_eeg' + str(trial + 1)] # 获取当前试验的信号/n num_sample = int(len(tmp_trial_signal[0]) / 100) # 样本数量/n print('{}-{}'.format(trial + 1, num_sample))/n/n temp_de = np.empty([0, num_sample]) # 存储当前试验的特征/n label = np.append(label, [all_label[trial]] * num_sample) # 将当前试验的标签重复num_sample次,然后添加到标签数组中。/n/n for channel in range(62): # 遍历所有通道/n trial_signal = tmp_trial_signal[channel] # 获取当前通道的信号/n/n # 对信号进行带通滤波/n delta = butter_bandpass_filter(trial_signal, 1, 4, frequency, order=3)/n theta = butter_bandpass_filter(trial_signal, 4, 8, frequency, order=3)/n alpha = butter_bandpass_filter(trial_signal, 8, 14, frequency, order=3)/n beta = butter_bandpass_filter(trial_signal, 14, 31, frequency, order=3)/n gamma = butter_bandpass_filter(trial_signal, 31, 51, frequency, order=3)/n/n DE_delta = np.zeros(shape=[0], dtype=float)/n DE_theta = np.zeros(shape=[0], dtype=float)/n DE_alpha = np.zeros(shape=[0], dtype=float)/n DE_beta = np.zeros(shape=[0], dtype=float)/n DE_gamma = np.zeros(shape=[0], dtype=float)/n/n for index in range(num_sample): # 遍历所有样本/n DE_delta = np.append(DE_delta, compute_DE(delta[index * 100:(index + 1) * 100])) # 计算当前样本Delta频带的差分熵,并将结果添加到Delta频带差分熵数组中/n DE_theta = np.append(DE_theta, compute_DE(theta[index * 100:(index + 1) * 100]))/n DE_alpha = np.append(DE_alpha, compute_DE(alpha[index * 100:(index + 1) * 100]))/n DE_beta = np.append(DE_beta, compute_DE(beta[index * 100:(index + 1) * 100]))/n DE_gamma = np.append(DE_gamma, compute_DE(gamma[index * 100:(index + 1) * 100]))/n/n temp_de = np.vstack([temp_de, DE_delta]) # 将Delta频带的差分熵数组作为一行添加到临时特征数组中/n temp_de = np.vstack([temp_de, DE_theta])/n temp_de = np.vstack([temp_de, DE_alpha])/n temp_de = np.vstack([temp_de, DE_beta])/n temp_de = np.vstack([temp_de, DE_gamma])/n/n temp_trial_de = temp_de.reshape(-1, 5, num_sample) # 将临时特征数组重新reshape为(样本数量,频带数量,样本长度)的形状/n temp_trial_de = temp_trial_de.transpose([2, 0, 1]) # 转置特征数组的维度顺序/n decomposed_de = np.vstack([decomposed_de, temp_trial_de]) # 将当前试验的特征添加到分解后的特征数组中/n/n print(/'trial_DE shape:/', decomposed_de.shape)/n return decomposed_de, label/n/n/n定义了一个函数butter_bandpass(lowcut, highcut, fs, order=5),用于设计Butterworth带通滤波器的系数。/n/npython/ndef butter_bandpass(lowcut, highcut, fs, order=5):/n nyq = 0.5 * fs/n low = lowcut / nyq/n high = highcut / nyq/n b, a = butter(order, [low, high], btype='band')/n return b, a/n/n/n定义了一个函数butter_bandpass_filter(data, lowcut, highcut, fs, order=5),用于对信号进行Butterworth带通滤波。/n/npython/ndef butter_bandpass_filter(data, lowcut, highcut, fs, order=5):/n b, a = butter_bandpass(lowcut, highcut, fs, order=order)/n y = lfilter(b, a, data)/n return y/n/n/n定义了一个函数compute_DE(signal),用于计算差分熵。/n/npython/ndef compute_DE(signal):/n variance = np.var(signal, ddof=1)/n return math.log(2 * math.pi * math.e * variance) / 2/n/n/n导入了数据文件的路径和简短名称的列表。/n/npython/nfile_path = 'D:/project/4D-CRNN/SEED/Preprocessed_EEG/'/n/npeople_name = ['1_20131027', '1_20131030', '1_20131107', # 定义一个包含数据文件名称的列表,用于遍历所有数据文件/n '6_20130712', '6_20131016', '6_20131113',/n '7_20131027', '7_20131030', '7_20131106',/n '15_20130709', '15_20131016', '15_20131105',/n '12_20131127', '12_20131201', '12_20131207',/n '10_20131130', '10_20131204', '10_20131211',/n '2_20140404', '2_20140413', '2_20140419',/n '5_20140411', '5_20140418', '5_20140506',/n '8_20140511', '8_20140514', '8_20140521',/n '13_20140527', '13_20140603', '13_20140610',/n '3_20140603', '3_20140611', '3_20140629',/n '14_20140601', '14_20140615', '14_20140627',/n '11_20140618', '11_20140625', '11_20140630',/n '9_20140620', '9_20140627', '9_20140704',/n '4_20140621', '4_20140702', '4_20140705']/n/nshort_name = ['djc', 'djc', 'djc', 'mhw', 'mhw', 'mhw', 'phl', 'phl', 'phl', # 定义一个包含简短名称的列表,用于标识数据文件的来源/n 'zjy', 'zjy', 'zjy', 'wyw', 'wyw', 'wyw', 'ww', 'ww', 'ww',/n 'jl', 'jl', 'jl', 'ly', 'ly', 'ly', 'sxy', 'sxy', 'sxy',/n 'xyl', 'xyl', 'xyl', 'jj', 'jj', 'jj', 'ys', 'ys', 'ys',/n 'wsf', 'wsf', 'wsf', 'wk', 'wk', 'wk', 'lqj', 'lqj', 'lqj']/n/n/n定义了两个空的数组X和y,用于存储特征和标签。/n/npython/nX = np.empty([0, 62, 5]) # 特征/ny = np.empty([0, 1]) # 标签/n/n/n通过循环遍历所有数据文件,对每个数据文件进行处理并将特征和标签添加到对应的数组中。/n/npython/nfor i in range(len(people_name)):/n file_name = file_path + people_name[i]/n print('processing {}'.format(people_name[i]))/n decomposed_de, label = decompose(file_name, short_name[i])/n X = np.vstack([X, decomposed_de])/n y = np.append(y, label)/n/n/n最后,将特征数组X和标签数组y保存到文件中。/n/npython/nnp.save(/'D:/project/4D-CRNN/SEED/DE0.5s/X_1D.npy/', X)/nnp.save(/'D:/project/4D-CRNN/SEED/DE0.5s/y.npy/', y)/n/n/n之后,代码加载保存的特征和标签文件,对特征进行重新排列,并将重新排列后的特征保存到文件中。/n/npython/nX = np.load('D:/project/4D-CRNN/SEED/DE0.5s/X_1D.npy')/ny = np.load('D:/project/4D-CRNN/SEED/DE0.5s/y.npy')/n/nX89 = np.zeros((len(y), 8, 9, 5)) # 生成8*9的矩阵形式/nX89[:, 0, 2, :] = X[:, 3, :] # 将原始特征中的某一部分复制到转换后的特征中/nX89[:, 0, 3:6, :] = X[:, 0:3, :]/nX89[:, 0, 6, :] = X[:, 4, :]/nfor i in range(5): # 5个频带/n X89[:, i + 1, :, :] = X[:, 5 + i * 9:5 + (i + 1) * 9, :]/nX89[:, 6, 1:8, :] = X[:, 50:57, :]/nX89[:, 7, 2:7, :] = X[:, 57:62, :]/n/nnp.save(/'D:/project/4D-CRNN/SEED/DE0.5s/X89.npy/', X89)/n/n/n这段代码的目的是将原始特征数组X重新排列为8/*9/*5的矩阵形式,并将重新排列后的特征数组保存到文件中。
原文地址: https://www.cveoy.top/t/topic/Qzq 著作权归作者所有。请勿转载和采集!