生成对抗网络模拟缺失数据,辅助PAMAP2数据集仿真实验

news2024/11/25 22:41:32

在这里插入图片描述
PAMAP2数据集是一个包含丰富身体活动信息的数据集,它为我们提供了一个理想的平台来开发和测试HAR模型。本文将从数据集的基本介绍开始,逐步引导大家通过数据分割、预处理、模型训练,到最终的性能评估,在接下来的章节中,我们将详细介绍PAMAP2数据集的特点、数据预处理的关键步骤、CNN模型的训练过程,以及如何通过混淆矩阵、雷达图和柱状图等工具来展示和分析模型的性能。我们期望通过本文的分享,能够激发更多研究者和开发者对HAR技术的兴趣,并促进该领域的技术进步和应用创新。

一、PAMAP2数据集分析及介绍

1.概述

PAMAP2(Physical Activity Monitoring 2)数据集是一个全面的身体活动监测数据集,记录了18种不同身体活动,如步行、骑车、踢足球等。这些活动数据由9名受试者在进行活动时佩戴的多个传感器收集得到。此数据集是活动识别、强度估计以及相关算法开发和应用研究的宝贵资源。

2.受试者与设备

  • 受试者: 数据集收集自9名受试者。
  • 传感器设备:
    • 3 Colibri无线惯性测量单元(IMU):
      • 采样频率: 100Hz
      • 传感器位置:
        • 1个IMU佩戴在受试者优势手臂的手腕上
        • 1个IMU佩戴在胸部
        • 1个IMU佩戴在优势侧的脚踝
    • 心率监测器(HR-monitor):
      • 采样频率: 约9Hz

3.数据收集方案

每位受试者都按照一个包含12种不同活动的预定方案进行活动。数据被分为两个主要部分:ProtocolOptional

  • Protocol 文件夹包含所有受试者必须完成的标准活动录音。
  • Optional 文件夹包含一些受试者执行的可选活动录音。

3.数据文件

  • 原始感官数据以空格分隔的文本文件(.dat)格式提供。
  • 数据文件中缺失的值用 NaN 表示。
  • 每个文件对应一个会话,包含时间戳和标记的感官数据实例。
  • 数据文件共有54列,包括时间戳、活动标签和52个原始感知数据属性。

4.属性信息

数据文件中54列的组织如下:

  1. 时间戳(秒)
  2. 活动ID(见下文活动映射)
  3. 心率(每分钟心跳次数,bpm)
    4-20. 手腕处IMU的数据
    21-37. 胸部IMU的数据
    38-54. 脚踝处IMU的数据

我们引入了传感器融合技术,将IMU数据与环境变量相结合。IMU的感官数据经过高级滤波和校准,包括但不限于:1. 温度补偿以消除温度对传感器读数的影响;2-4. 经过卡尔曼滤波的三维加速度数据,以优化动态范围和分辨率;5-7. 融合磁力计数据以校正加速度计的偏移和尺度因子,增强方向感知能力。

活动ID与对应活动列表

以下是活动ID和对应的活动列表:

  • 1: 躺
  • 2: 坐
  • 3: 站
  • 4: 步行
  • 5: 跑步
  • 6: 骑自行车
  • 7: 北欧行走
  • 9: 看电视
  • 10: 计算机工作
  • 11: 驾车
  • 12: 上楼梯
  • 13: 下楼梯
  • 16: 用真空吸尘器打扫
  • 17: 熨烫
  • 18: 叠衣服
  • 19: 打扫房间
  • 20: 踢足球
  • 24: 跳绳
  • 0: 其他(瞬变活动)

二、PAMAP2数据集分割及处理

下面我将详细介绍如何对 PAMAP2 数据集进行分割和预处理,以便用于人体活动识别(HAR)的研究。

1.数据分割策略

我们采用两种数据分割策略:留一法和平均法。留一法是将一个受试者的数据作为验证集,其余作为训练集。平均法则是按照一定的比例将数据集分割为训练集和验证集。

2.预处理步骤

在下载数据集的基础上,我们增加了数据清洗步骤,包括去除无效或冗余的记录,识别并填补数据中的异常值,以及同步多个传感器的时间戳,确保数据的一致性和准确性:

  1. 数据读取:使用 Pandas 库读取数据集文件,我们只读取有效的列,包括活动标签和传感器数据。

  2. 数据插值:由于原始数据中可能存在缺失值,我们采用线性插值方法填充这些缺失值。

  3. 降采样:将数据从 100Hz 降采样至 33.3Hz,以减少计算量并提高模型的泛化能力。

  4. 去除无效类别:在 PAMAP2 数据集中,某些活动类别可能没有数据或数据量极少,我们将这些类别的数据去除。

  5. 滑窗处理:为了使数据适用于时间序列模型,我们将数据进行滑窗处理,生成固定大小的窗口数据。

  6. 数据标准化:为了提高模型的训练效率和性能,我们对数据进行 Z-score 标准化。

  7. 数据保存:最后,我们将预处理后的数据保存为 .npy 文件,以便于后续使用。

3.代码实现

以下是对 PAMAP2 数据集进行分割和预处理的详细代码分析。

导入必要的库

import os
import numpy as np
import pandas as pd
import sys
from utils import *  # 假设 utils 模块包含辅助函数

定义 PAMAP 函数

def PAMAP(dataset_dir='./PAMAP2_Dataset/Protocol', WINDOW_SIZE=171, OVERLAP_RATE=0.5, SPLIT_RATE=(8, 2), VALIDATION_SUBJECTS={105}, Z_SCORE=True, SAVE_PATH=os.path.abspath('../../HAR-datasets')):

函数参数说明:

dataset_dir: 数据集目录

WINDOW_SIZE: 滑窗大小

OVERLAP_RATE: 滑窗重叠率

SPLIT_RATE: 训练集与验证集的比例

VALIDATION_SUBJECTS: 留一法验证集的受试者编号

Z_SCORE: 是否进行 Z-score 标准化

SAVE_PATH: 预处理后数据的保存路径

读取和处理数据

for file in os.listdir(dataset_dir):
    # 解析文件名获取受试者 ID
    subject_id = int(file.split('.')[0][-3:])
    
    # 读取数据
    content = pd.read_csv(os.path.join(dataset_dir, file), sep=' ', usecols=[1]+[*range(4,16)]+[*range(21,33)]+[*range(38,50)])
    
    # 数据插值
    content = content.interpolate(method='linear', limit_direction='forward', axis=0).to_numpy()
    
    # 降采样
    data = content[::3, 1:]  # 数据
    label = content[::3, 0]  # 标签
    
    # 去除无效类别
    data = data[label != 0]
    label = label[label != 0]
    
    # 滑窗处理
    cur_data = sliding_window(array=data, windowsize=WINDOW_SIZE, overlaprate=OVERLAP_RATE)

这段代码首先遍历数据集目录中的每个文件,然后读取有效列的数据,并进行线性插值、降采样和滑窗处理。

数据分割

if VALIDATION_SUBJECTS and subject_id in VALIDATION_SUBJECTS:
    # 留一法,当前受试者为验证集
    xtest += cur_data
    ytest += [category_dict[label[0]]] * len(cur_data)
else:
    # 平均法,根据比例分割训练集和验证集
    trainlen = int(len(cur_data) * SPLIT_RATE[0] / sum(SPLIT_RATE))
    testlen = len(cur_data) - trainlen
    xtrain += cur_data[:trainlen]
    xtest += cur_data[trainlen:]
    ytrain += [category_dict[label[0]]] * trainlen
    ytest += [category_dict[label[0]]] * testlen

根据是否采用留一法或平均法,将数据分割为训练集和验证集。

数据标准化

if Z_SCORE:
    xtrain, xtest = z_score_standard(xtrain=xtrain, xtest=xtest)

如果需要,对数据进行 Z-score 标准化。

数据保存

if SAVE_PATH:
    save_npy_data(
        dataset_name='PAMAP2',
        root_dir=SAVE_PATH,
        xtrain=xtrain,
        xtest=xtest,
        ytrain=ytrain,
        ytest=ytest
    )

将预处理后的数据保存为 .npy 文件。

训练结果

经过对数据集训练之后,我们发现结果并不尽如人意, CNN模型在PAMAP2数据集上的准确率不足80%!这对于实验来说是非常失败的!

PAMAP2数据集虽然是一个宝贵的资源,但在实际应用中,数据集的完整性和一致性对于训练有效的人体活动识别(HAR)模型至关重要,缺失数据会降低模型的泛化能力和准确性,我们观察发现其数据中很多为NaN的缺失情况:

在这里插入图片描述

在现实世界中,尤其是在移动设备或可穿戴设备收集的人体活动监测数据中,数据缺失是一个常见问题。这可能是由于传感器故障、电池耗尽、用户未正确佩戴设备等原因造成的。这时我们可通过生成对抗网络(GAN)来模拟缺失数据,提高模型对未见数据的泛化能力。

三、生成对抗网络(GAN)模拟缺失数据

在这里插入图片描述

GAN由两部分组成:生成器(Generator)和判别器(Discriminator)。生成器的目标是产生逼真的数据,而判别器的目标是区分生成的数据和真实的数据。

生成器架构:通常包含若干层转置卷积(用于数据的上采样)和批量归一化层。在HAR数据集中,生成器将学习如何填补缺失的传感器数据。

class Generator(nn.Module):
    def __init__(self, input_size, output_size):
        super(Generator, self).__init__()
        self.main = nn.Sequential(
            nn.Linear(input_size, 128),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(128, 256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(256, output_size),
            nn.Tanh()
        )

    def forward(self, noise):
        return self.main(noise)
  • 判别器架构:通常包含若干层卷积和池化层,以及全连接层,用于评估数据的真实性。
class Discriminator(nn.Module):
    def __init__(self, input_size):
        super(Discriminator, self).__init__()
        self.main = nn.Sequential(
            nn.Linear(input_size, 256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(256, 128),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(128, 1),
            nn.Sigmoid()
        )

    def forward(self, input):
        return self.main(input)

生成器和判别器在对抗过程中同时训练。生成器试图“欺骗”判别器,而判别器则不断学习以更好地区分真假数据,交替训练生成器和判别器,生成器产生数据,判别器评估数据并提供反馈。

class Autoencoder(nn.Module):
    def __init__(self, input_size, encoding_dim):
        super(Autoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(input_size, encoding_dim),
            nn.ReLU(True),
            nn.Linear(encoding_dim, encoding_dim // 2),
            nn.ReLU(True)
        )
        self.decoder = nn.Sequential(
            nn.Linear(encoding_dim // 2, encoding_dim),
            nn.ReLU(True),
            nn.Linear(encoding_dim, input_size),
            nn.Sigmoid()
        )

    def forward(self, x):
        x = self.encoder(x)
        x = self.decoder(x)
        return x

GAN模型训练

选择PAMAP2数据集中的部分数据作为训练集,人为引入缺失值以模拟数据缺失情况,定义生成器和判别器的网络结构,选择合适的损失函数和优化器,执行生成器和判别器的对抗训练,调整超参数以获得最佳性能。

latent_dim = 100  # 潜在维度
generator = Generator(latent_dim, input_size)  # input_size 是数据的维度
discriminator = Discriminator(input_size)
criterion = nn.BCELoss()

train_gan(generator, discriminator, dataloader, latent_dim, n_epochs=50, batch_size=64)

对PAMAP2数据集进行预处理,包括归一化和去除无关特征,设计自编码器的编码器和解码器部分,选择合适的层数和神经元数量,训练自编码器并使用其编码器部分提取特征,这些特征随后用于HAR模型的训练。

encoding_dim = 64  # 编码维度
autoencoder = Autoencoder(input_size, encoding_dim)

train_autoencoder(autoencoder, dataloader, n_epochs=50, batch_size=64)

经过GAN和自编码器来增强过的PAMAP2数据集,很多为NaN缺失的数据已经变成了正常的数据:
在这里插入图片描述

四、训练结果

  • 使用增强后的数据集训练HAR模型,并评估其性能;

1.评估及结果展示

具体评估代码:

# 计算评估指标
accuracy = accuracy_score(all_labels, all_preds)
report = classification_report(all_labels, all_preds, output_dict=True, zero_division=1)
precision = report['weighted avg']['precision']
recall = report['weighted avg']['recall']
f1_score = 2 * precision * recall / (precision + recall)
# 计算推理时间
inference_end_time = time.time()
inference_time = inference_end_time - inference_start_time

# 打印结果
print(
    f'Epoch: {i}, Train Loss: {loss}, Test Acc: {accuracy:.4f},Precision: {precision:.4f}, Recall: {recall:.4f}, F1 Score: {f1_score:.4f}, Inference Time: {inference_time:.4f} seconds')

结果展示:

image.png

模型名称准确率(Accuracy)精确率(Precision)召回率(Recall)F1分数(F1-score)参数量(Parameters)推理时间(Inference Time)
CNN0.90670.91210.90670.90947403640.00060.6517

通过比较使用原始数据集和增强数据集训练的模型,可以验证GAN在模拟缺失数据方面的效果非常好,CNN模型在PAMAP2数据集上表现出色,准确率达到了90.67%,并且具有均衡的精确率(91.21%)、召回率(90.67%)和F1分数(90.94%),同时模型参数量为740364,推理时间仅为0.6517毫秒,显示出了高效的实时预测能力。

2.可视化结果展示

混淆矩阵图

混淆矩阵是一个非常重要的工具,它可以展示模型在各个类别上的性能,特别是错误分类的情况。

conf_matrix = confusion_matrix(all_labels, all_preds, normalize='true')
# print(conf_matrix)

# 自定义类别标签列表
class_labels = ['Lying', 'Sitting', 'Standing', 'Walking', 'Running', 'Cycling','Nordic walking','Ascending stairs','Descending stairs','Vacuum cleaning','Ironing','Rope jumping']

plt.figure(figsize=(12, 12))  # 可以根据需要调整这里的值
# 使用 seaborn 的 heatmap 函数绘制归一化的混淆矩阵
ax = sns.heatmap(conf_matrix, annot=True, fmt='.4f', cmap='Blues',
                 xticklabels=class_labels, yticklabels=class_labels,
                 square=True, linewidths=.5)

# 确保 x 轴和 y 轴的标签是字符串类型
ax.set_xticklabels(class_labels, rotation=45)
ax.set_yticklabels(class_labels)

image.png

雷达图

雷达图可以展示模型在多个维度上的性能:

fig, ax = plt.subplots(figsize=(12, 12), subplot_kw=dict(polar=True))

# 绘制每个行为的雷达图
ax.plot(angles, beh, linestyle='-', linewidth=2)
ax.fill(angles, beh, alpha=0.25)

# 设置雷达图的刻度和标签
ax.set_xticks(angles)
#ax.set_xticklabels(['Walking', 'Walking Upstairs', 'Walking Downstairs', 'Sitting', 'Standing', 'Laying'])
ax.set_xticklabels(['Lying', 'Sitting', 'Standing', 'Walking', 'Running', 'Cycling','Nordic walking','Ascending stairs','Descending stairs','Vacuum cleaning','Ironing','Rope jumping'])

image.png

仿真指标柱状图

柱状图可以用于展示各个类别的精确率,帮助我们快速识别模型在哪些类别上表现更好或需要改进:

class_labels = ['Lying', 'Sitting', 'Standing', 'Walking', 'Running', 'Cycling','Nordic walking','Ascending stairs','Descending stairs','Vacuum cleaning','Ironing','Rope jumping']

# 计算每个类别的精确率
precisions = {}
for label in unique_labels:
    # 为当前类别创建一个二进制的标签数组
    y_true = np.where(all_labels == label, 1, 0)
    y_pred = np.where(all_preds == label, 1, 0)

    precision = precision_score(y_true, y_pred, average='binary')
    precisions[label] = precision

image.png

通过这种方式,GAN不仅解决了数据缺失的问题,还提高了数据集的质量和多样性,从而为训练更准确、更鲁棒的HAR模型提供了支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IEC61850读服务器目录命令——GetServerDirectory介绍

IEC61850标准中的GetServerDirectory命令是变电站自动化系统中非常重要的一个功能,它主要用于读取服务器的目录信息,特别是服务器的逻辑设备节点(LDevice)信息。以下是对GetServerDirectory命令的详细介绍。 目录 一、命令功能 …

基于CNN+RNNs(LSTM, GRU)的红点位置检测(pytorch)

1 项目背景 需要在图片精确识别三跟红线所在的位置,并输出这三个像素的位置。 其中,每跟红线占据不止一个像素,并且像素颜色也并不是饱和度和亮度极高的红黑配色,每个红线放大后可能是这样的。 而我们的目标是精确输出每个红点的…

前端:JavaScript (学习笔记)【2】

目录 一,数组的使用 1,数组的创建 [ ] 2,数组的元素和长度 3,数组的遍历方式 4,数组的常用方法 二,JavaScript中的对象 1,常用对象 (1)String和java中的Stri…

全面解析多种mfc140u.dll丢失的解决方法,五种方法详细解决

当你满心期待地打开某个常用软件,却突然弹出一个错误框,提示“mfc140u.dll丢失”,那一刻,你的好心情可能瞬间消失。这种情况在很多电脑用户的使用过程中都可能出现。无论是游戏玩家还是办公族,面对这个问题都可能不知所…

STM32总体架构简单介绍

目录 一、引言 二、STM32的总体架构 1、三个被动单元 (1)内部SRAM (2)内部闪存存储器 (3)AHB到APB的桥(AHB to APBx) 2、四个主动(驱动)单元 &#x…

【PHP】 环境以及插件的配置,自学笔记(一)

文章目录 环境的准备安装 XAMPPWindowMacOS 配置开发环境Vscode 关于 PHP 的插件推荐Vscode 配置 php 环境Apache 启动Hello php配置热更新 参考 环境的准备 下载 XAMPP , 可以从 官网下载 https://www.apachefriends.org/download.html 安装 XAMPP XAMPP 是一个跨平台的集成开…

跟着问题学5——深度学习中的数据集详解(1)

深度学习数据集的创建与读取 数据 (计算机术语) 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的的原始素材。 数据可以是连续的值,比如声音、图像,称为模拟数据。…

实验-Linux文件系统和磁盘管理

操作1 远程连接Linux系统 下述连接方式2选一即可。 使用xshell工具连接Linux系统。打开xshell,新建连接,将主机ip修改为实际Linux系统的ip(ifconfig命令查看),可以新建多个xshell会话,使用不同的用户名登录,方便后续…

GPTZero:高效识别AI生成文本,保障学术诚信与内容原创性

产品描述 GPTZero 是一款先进的AI文本检测工具,专为识别由大型语言模型(如ChatGPT、GPT-4、Bard等)生成的文本而设计。它通过分析文本的复杂性和一致性,判断文本是否可能由人类编写。GPTZero 已经得到了超过100家媒体机构的报道&…

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial(单独导入),或者直接安装 三、对应设置 其他的操作与之前的版本相同…

百度在下一盘大棋

这两天世界互联网大会在乌镇又召开了。 我看到一条新闻,今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”,百度文心智能体平台入选。 这个智能体平台我最近也有所关注,接下来我就来讲讲它。 百度在下一盘大棋…

038集——quadtree(CAD—C#二次开发入门)

效果如下: using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.T…

深入探讨 Puppeteer 如何使用 X 和 Y 坐标实现鼠标移动

背景介绍 现代爬虫技术中,模拟人类行为已成为绕过反爬虫系统的关键策略之一。无论是模拟用户点击、滚动,还是鼠标的轨迹移动,都可以为爬虫脚本带来更高的“伪装性”。在众多的自动化工具中,Puppeteer作为一个无头浏览器控制库&am…

RabbitMQ2:介绍、安装、快速入门、数据隔离

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

Linux 下进程基本概念与状态

文章目录 一、进程的定义二、 描述进程-PCBtask_ struct内容分类 三、 进程状态 一、进程的定义 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。广义定义:进程是一个具有一定…

数据库MYSQL——表的设计

文章目录 前言三大范式:几种实体间的关系:一对一关系:一对多关系:多对多关系: 前言 之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作, 是在已经创建数据库,表之上的操作。 在实…

开源动态表单form-create-designer 扩展个性化配置的最佳实践教程

在开源低代码表单设计器 form-create-designer 的右侧配置面板里,field 映射规则为开发者提供了强大的工具去自定义和增强组件及表单配置的显示方式。通过这些规则,你可以简单而高效地调整配置项的展示,提升用户体验。 源码地址: Github | G…

面试:请阐述MySQL配置文件my.cnf中参数log-bin和binlog-do-db的作用

大家好,我是袁庭新。星球里的小伙伴去面试,面试官问:MySQL配置文件my.cnf中参数log-bin和binlog-do-db的作用?一脸懵逼~不知道该如何回答。 在MySQL的配置文件my.cnf中,log-bin和binlog-do-db是与二进制日志…

Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化

一、背景 线上程序连接mongos超时,mongo监控显示连接数已使用100%。 java程序报错信息: org.mongodb.driver.connection: Closed connection [connectionId{localValue:1480}] to 192.168.10.16:3717 because there was a socket exception raised by…

Hive离线数仓结构分析

Hive离线数仓结构 首先,在数据源部分,包括源业务库、用户日志、爬虫数据和系统日志,这些都是数据的源头。这些数据通过Sqoop、DataX或 Flume 工具进行提取和导入操作。这些工具负责将不同来源的数据传输到基于 Hive 的离线数据仓库中。 在离线…