matlab的旋律 发表于 2021-12-11 00:14:07

基于六轴传感器信号和深度学习模型的人体动作识别(三)样本预处理

本帖最后由 matlab的旋律 于 2021-12-13 00:07 编辑

    前面介绍了样本的标注,接下来介绍用于分类模型输入的数据预处理。由于本系列介绍的分类模型包括机器学习模型和深度学习模型,在输入机器学习模型之前的数据通常需要经过预处理和特征过程,而输入深度学习模型之前的数据通常只需要经过预处理,可以实现端到端的模型。也就是说机器学习模型和深度学习模型最根本区别是特征过程,其中的区别可以用下图的流程示意:
       有关特征工程的介绍可以参考帖子特征工程技术与方法,为了使得介绍机器学习和深度学习的过程对齐,本文将特征工程也归纳那位数据的预处理(由于数据规模的问题,实际上深度学习通常也会使用一定的特征工程)。下面首先介绍用于特征工程提取的方法,首先对原始长度为2秒410个点24通道的原始数据进行特征计算,计算方法分别提取24个通道每个通道的均值、未覆盖窗口的均值、标准差、未覆盖窗口的标准差、偏度、峰度和线性拟合一次系数计7个特征,最后的特征数为24*7=168个(如果觉得模型的输入量太大的话还可以继续进行压缩,如用PCA进行主成分提取等)。对应的python程序如下:
def create_features(data):
   group_store = np.expand_dims(data, axis=0)
   store_corr = np.stack(, axis=0)#Pearson乘积矩相关系数的矩阵
   store_features = np.stack([
          group_store.mean(axis=2),#均值
          group_store[:, :, int(data.shape / 2):].mean(axis=2),#未覆盖窗口的均值
          group_store.std(axis=2),#标准差
          group_store[:, :, int(data.shape / 2):].std(axis=2),#未覆盖窗口的标准差
          skew(group_store, axis=2),#偏度
          kurtosis(group_store, axis=2),#峰度
          np.apply_along_axis(lambda x: np.polyfit(np.arange(0, data.shape), x, 1), 2, group_store)
    ], axis=1)#线性拟合一次系数
    group_store = np.transpose(group_store, (0, 2, 1))
    store_features = np.transpose(store_features, (0, 2, 1))
    return group_store, store_corr, store_features另外,这里计算了单个原始数据样本的Pearson乘积矩相关系数的矩阵,后续在介绍深度学习中的图卷积模型会用到。
       深度学习较为常用预处理方法是归一化和标准化,两者在本质上都是一种线性变换。线性变换使得线性组合与线性关系式保持不变,这也确保了对应模型不会失效。归一化是将数据缩放到到区间(0-1),而标准化是将数据缩放为均值为0,标准差为1的范围。其对应的公式分别如下:
标准化公式:
归一化公式:
上述公式都可用在训练集上,然后计算出对应的常数用于测试集的预处理,这是因为通常测试集的样本数量较少,很难满足统计学的分布。测试集标准化和归一化对应的公式分别如下:测试集标准化公式:
测试集归一化公式:
这里的是指预处理之前的原始数据样本。在python有用于标准化和归一化库函数,分别对应StandardScaler和MinMaxScaler,在sklearn.preprocessing中。关于模型预处理标准化和归一化方法的选用,一般遵循对输出结果范围有要求,或者数据较为稳定,不存在极端的最大最小值使用归一化预处理方法;当数据存在异常值和较大噪声时,使用标准化预处理方法,这样可以间接通过中心化避免异常值和极端值的影响。因此,针对六轴传感器信号通常要处理噪声,使用标准化预处理方法更为合适。             对样本标注中划分的训练集和测试进行预处理的代码如下:
from sklearn.preprocessing import StandardScaler, MinMaxScaler

scaler_train_seq = StandardScaler()#标准化
scaler_train_seq = MinMaxScaler()#归一化
X_train_seq = scaler_train_seq .fit_transform(X_train_seq, reshape(-1, X_train_seq.shape)).reshape(X_train_seq.shape)#训练集的预处理
X_test_seq = scaler_train_seq .transform(X_test_seq , reshape(-1, X_test_seq .shape)).reshape(X_test_seq .shape)#使用训练集预处理参数对测试集进行预处理当然,有一些情况是先对原始数据样本进行特征工程后再进行标准化或者归一化化的处理,或者直接进行主成分提取的处理,有兴趣的可以自己去尝试一下。


页: [1]
查看完整版本: 基于六轴传感器信号和深度学习模型的人体动作识别(三)样本预处理