最近在处理EEG数据,遇到不等长的EEG数据,需要处理成等长的数据。
首先:
先看数据的分布,是否符合正太分布,datas_lengths是数据长度的列表,分别存储每一个样本的数据长度
num_tokens = np.array(data_lengths)
plt.hist(np.log(num_tokens), bins = 100)
plt.xlim((1,10))
plt.ylabel('number of tokens')
plt.xlabel('length of tokens')
plt.title('Distribution of tokens length')
plt.show()
显示数据柱状图:
然后:
这里用一个均值+2个标准差,可以覆盖到97%左右的数据。(正态分布的特性)
max_tokens = np.mean(data_lengths) + 2 * np.std(data_lengths)
max_tokens = int(max_tokens)
max_tokens
最后:
使用pad_sequences(keras包提供的函数)截取和补齐数据
(长于max_tokens的数据进行截取,短于max_tokens的数据进行补0)
from tensorflow.python.keras.preprocessing.sequence import pad_sequences
train_pad = pad_sequences(x_data, maxlen=max_tokens,
padding='pre', truncating='pre',dtype=float)
参数说明
sequences
:浮点数或整数构成的两层嵌套列表maxlen
:None或整数,为序列的最大长度。大于此长度的序列将被截短,小于此长度的序列将在后部填0.dtype
:返回的numpy array的数据类型padding
:‘pre’或‘post’,确定当需要补0时,在序列的起始还是结尾补`truncating
:‘pre’或‘post’,确定当需要截断序列时,从起始还是结尾截断value
:浮点数,此值将在填充时代替默认的填充值
参考:https://blog.csdn.net/wcy23580/article/details/84957471
https://keras-cn.readthedocs.io/en/latest/preprocessing/sequence/