【已更新完毕】2025泰迪杯数据挖掘竞赛B题数学建模思路代码文章教学:基于穿戴装备的身体活动监测

news2025/4/15 22:56:39

基于穿戴装备的身体活动监测

摘要

本研究基于加速度计采集的活动数据,旨在分析和统计100名志愿者在不同身体活动类别下的时长分布。通过对加速度数据的处理,活动被划分为睡眠、静态活动、低强度、中等强度和高强度五类,进而计算每个志愿者在各类活动中的总时长。研究结果揭示了不同个体在活动强度上的差异,为后续的个性化健康管理和运动干预提供了重要数据支持。此外,结合可视化分析,进一步揭示了志愿者的活动模式,帮助更好地理解个体行为差异及群体健康趋势。

本研究通过无监督学习方法,对志愿者的身体活动数据进行了聚类分析,旨在识别不同的活动模式。基于志愿者的加速度数据和MET 值,本文采用 KMeans 和高斯混合模型(GMM)两种聚类算法进行活动模式识别。通过聚类分析,成功将志愿者的活动模式划分为三类:睡眠模式三(深睡)、睡眠模式一(浅睡)和睡眠模式二(中度/REM)。这些活动模式的划分为进一步理解志愿者的行为模式和睡眠结构提供了依据。通过计算每个模式下的时长,本研究揭示了不同个体在活动强度和睡眠阶段上的差异,为后续的健康干预和个性化健康管理提供了数据支持。

本研究进一步对志愿者的久坐行为进行了识别和分析。通过滑动窗口方法,结合加速度数据和MET 值,我们成功识别出志愿者持续超过30分钟的静态行为,并计算了每位志愿者的总久坐时长。每个持续静态状态的行为段被标记为久坐行为,累计计算每位志愿者的久坐时长。通过随机森林算法、CNN+LSTM组合算法进行预测。研究结果表明,不同志愿者的久坐行为存在显著差异,某些个体表现出较高的久坐时长,提示可能需要更强的健康干预措施。通过这一分析,我们为个性化健康干预、久坐行为管理以及健康风险评估提供了有效的数据支持。

关键词:身体活动监测、随机森林、K-means聚类、GMM、滑动窗口

目录
基于穿戴装备的身体活动监测 1
摘要 1
一、 问题重述 3
1.1 问题背景 3
1.2 要解决的问题 3
二、 问题分析 5
2.1 任务一的分析 5
2.2 任务二的分析 5
2.3 任务三的分析 5
2.4 任务四的分析 5
三、 问题假设 7
四、 模型原理 8
4.1 随机森林模型 8
4.2 K-means聚类算法 9
4.3 GMM模型 11
五、 模型建立与求解 14
5.1 问题一建模与求解 14
5.2 问题二建模与求解 19
5.3 问题三建模与求解 24
5.4 问题四建模与求解 28
六、 模型评价与推广 31
6.1 模型的评价 31
6.1.1模型优点 31
6.1.2模型缺点 32
6.2 模型推广 33
附录【自行删减】 35

任务 主要技术 关键步骤

  1. 统计分析 数据处理、MET 分类 时间计算、分类统计

  2. MET 值预测 机器学习(XGBoost/LSTM) 特征提取、回归建模

  3. 睡眠分析 深度学习(CNN/LSTM) 睡眠阶段分类

  4. 久坐预警 滑动窗口分析 连续静态行为检测

  5. 统计分析志愿者的活动情况
    在这里插入图片描述
    在这里插入图片描述

目标:
根据 100 位志愿者的加速度数据,计算各项活动时长,并进行统计汇总。

数据说明:
数据存储在 P[ID].csv 文件,每行包含:
时间戳(毫秒)
X/Y/Z 方向加速度(g)
活动标签(MET 值)

Metadata1.csv 提供志愿者的性别和年龄信息。

解题思路:

数据读取:
读取 P[ID].csv 文件,解析时间戳转换为小时级别。
读取 Metadata1.csv,合并志愿者元数据。

计算各项时长:
计算 总记录时长:时间戳转换为小时后求总时长。
根据 MET 值分类:
MET ≥ 6.0 → 高强度运动
3.0 ≤ MET < 6.0 → 中等强度运动
1.6 ≤ MET < 3.0 → 低强度运动
1.0 ≤ MET < 1.6 → 静态行为
MET < 1.0 → 睡眠

统计每种 MET 分类下的时间总量。

生成表格 result_1.xlsx,列格式: | 志愿者ID | 总时长 | 睡眠时长 | 高强度运动 | 中等强度 | 低强度 | 静态活动 |
导出 Excel 文件。

在这里插入图片描述

遍历每个志愿者文件

for pid in pids:

file_path = f'{pid}.csv'  # 假设文件名为P001.csv格式

# 读取数据文件

df = pd.read_csv(file_path, parse_dates=['time'])

# 计算时间间隔(转换为小时)

df['duration'] = df['time'].diff().dt.total_seconds().fillna(0) / 3600

# 提取MET值

df['MET'] = df['annotation'].str.extract(r'MET (\d+\.?\d*)').astype(float)

# 分类活动类型

df['activity'] = df['MET'].apply(classify_activity)

# 按活动类型汇总时长

activity_duration = df.groupby('activity')['duration'].sum()

# 构建结果行

result = {

    '志愿者 ID': pid,

    '记录总时长(小时)': df['duration'].sum().round(4),

    '睡眠总时长(小时)': activity_duration.get('sleep', 0).round(4),

    '高等强度运动总时长(小时)': activity_duration.get('high', 0),

    '中等强度运动总时长(小时)': activity_duration.get('medium', 0),

    '低等强度运动总时长(小时)': activity_duration.get('low', 0),

    '静态活动总时长(小时)': activity_duration.get('static', 0)

}

results.append(result)

2.构建 MET 值估计模型
目标:
利用 100 名志愿者的数据,构建 机器学习模型,预测新的 20 名志愿者的 MET 值。

数据说明:
P[ID].csv:包含加速度计数据及 MET 值(用于训练)。
Metadata1.csv:包含志愿者的性别、年龄信息。
T[ID].csv:20 位新志愿者的加速度计数据(用于预测)。
Metadata2.csv:包含 20 位新志愿者的性别、年龄信息。

解题思路:

数据预处理
解析加速度数据(X/Y/Z)。

计算时序特征:
时域特征(均值、标准差、最大值、最小值等)
频域特征(FFT 分析)

结合年龄、性别数据,标准化特征。

特征工程
采用 滑动窗口(如 1 秒、5 秒窗口)进行特征提取:
平均加速度、方差、均方根(RMS)
瞬时速度估计
频谱能量

目标变量为 MET 值。

模型选择
回归模型(目标变量为连续值):
XGBoost / LightGBM
随机森林
LSTM / GRU(处理时序数据)
CNN+LSTM 组合模型
选择 均方误差(MSE)以及 平均绝对误差(MAE) 作为损失函数。

模型训练
划分训练集与验证集(80% 训练 / 20% 验证)。
调参优化(交叉验证)。
评估模型泛化能力。
预测新志愿者 MET 值
使用训练好的模型预测 T[ID].csv 20 位志愿者的数据。
保存预测结果 result_2.xlsx。

5.2.2 特征工程与数据处理

1.时间窗口构造
将原始加速度数据按 5 秒为单位划分为多个不重叠的时间窗口。设某志愿者的加速度数据为三维时间序列 ,时间窗口长度为 秒,则第 个窗口内包含的数据为:

在每个时间窗口中提取统计特征和频域特征,构成特征向量 。
2.特征提取基本原理
在每个窗口 内,提取以下特征:
时域特征:对每个轴向的加速度数据 ,计算其均值(mean)、标准差(std)、最大值(max)、最小值(min):

加速度幅值(Magnitude)特征:定义三轴加速度的合成加速度为:

并提取其均值与标准差:

频域特征:对加速度幅值序列 进行离散傅里叶变换(DFT):

在这里插入图片描述

在这里插入图片描述

======================

数据准备

======================

def extract_features(accel_data):

"""从三轴加速度数据中提取特征"""

features = {}

# 时域特征

for axis in ['x', 'y', 'z']:

    # 基本统计量

    features[f'{axis}_mean'] = accel_data[axis].mean()

    features[f'{axis}_std'] = accel_data[axis].std()

    features[f'{axis}_max'] = accel_data[axis].max()

    features[f'{axis}_min'] = accel_data[axis].min()

    #features[f'{axis}_mad'] = accel_data[axis].mad()  # 平均绝对偏差

    # 幅值特征

    magnitude = np.sqrt(accel_data[['x', 'y', 'z']].pow(2).sum(axis=1))

    features['magnitude_mean'] = magnitude.mean()

    features['magnitude_std'] = magnitude.std()

# 频域特征

fft = np.fft.fft(magnitude)

features['dominant_freq'] = np.argmax(np.abs(fft))  # 主频率

return pd.Series(features)

遍历每个志愿者文件

for _, row in tqdm(metadata.iterrows(), total=len(metadata)):

pid = row['pid']

file_path = f'{pid}.csv'

# 读取加速度数据

df = pd.read_csv(file_path)

df['MET'] = df['annotation'].str.extract(r'MET (\d+\.?\d*)').astype(float)

# 按时间窗口处理(5秒窗口)

window_size = '5S'

df['time'] = pd.to_datetime(df['time'])

grouped = df.set_index('time').groupby(pd.Grouper(freq=window_size))

# 窗口特征提取

for _, window in grouped:

    if len(window) > 0:

        features = extract_features(window[['x', 'y', 'z']])

        features['age'] = row['age']

        features['sex'] = row['sex']

        all_features.append(features)

        all_targets.append(window['MET'].mean())
  1. 睡眠阶段智能识别
    目标:
    设计睡眠阶段分类算法,基于加速度数据识别不同的睡眠状态。
    数据说明:
    P[ID].csv(训练数据,包含 MET 值)。
    T[ID].csv(测试数据,无 MET 值,需要进行预测)。

解题思路:

数据预处理
选取 睡眠数据(MET < 1.0) 作为分析对象。
计算 睡眠时段的加速度特征:
运动量(X/Y/Z 方向变化率)
姿态变化(角度计算)
低频信号分析(检测深度睡眠)

特征提取
使用 滑动窗口法(如 30s、60s 窗口)提取特征:
加速度均值、标准差
突发运动频率
睡眠稳定性指标(基于 FFT 低频功率)

模型选择 分类模型:
传统机器学习(Random Forest, SVM)
深度学习(LSTM、CNN)

目标:划分 不同睡眠阶段(如浅睡、深睡、REM)。
模型训练与预测
训练模型,调整超参数。
预测 20 名志愿者的睡眠阶段,输出 result_3.xlsx。

聚类结果的解释与活动模式识别

为了评估不同聚类算法在本问题中的适用性与有效性,本文计算了

KMeans

与高斯混合模型(

GMM

)两种聚类方法在标准化特征空间上的轮廓系数(

Silhouette Coefficient

)。轮廓系数是一种常用的无监督聚类性能评估指标,综合衡量了簇内紧密度和簇间分离度。其取值范围为

[

1,1][-1, 1][

1,1]

,值越接近

1

表示聚类结果越合理,聚类边界越清晰;值接近

0

表示簇之间重叠较多,聚类效果模糊;若为负值,则可能存在簇划分错误的情况。

本实验结果如下:
KMeans 聚类轮廓系数:0.2296
GMM 聚类轮廓系数:0.0277

大多数志愿者的睡眠时长主要集中在

“睡眠模式三(深睡)”和“睡眠模式一(浅睡)”之间,表明深度睡眠和浅睡是大多数志愿者的主要睡眠阶段。而“睡眠模式二(中度

/REM

)”的时间占比相对较低,但在一些志愿者中,可能由于特定生理特征或生活习惯,表现出较为明显的中度睡眠模式。

在这里插入图片描述

  1. 久坐行为健康预警
    目标:
    检测志愿者 久坐行为(单次静态时间超过 30 分钟,MET < 1.6)。

解题思路:

数据解析
解析时间戳,转换为分钟级别时间轴。
计算连续静态行为(MET < 1.6)。

久坐检测
采用 滑动窗口分析:
若 连续 30 分钟以上 处于 MET < 1.6,则标记为久坐行为。
计算 久坐持续时间 及 久坐次数。

预警策略
若 单次久坐超过 1 小时 → 预警等级 1
若 每日久坐总时长 > 6 小时 → 预警等级 2
若 久坐超过 10 小时 → 预警等级 3(高风险)

生成结果
输出每位志愿者的久坐时间及预警信息。

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

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

相关文章

212、【图论】字符串接龙(Python)

题目描述 题目链接&#xff1a;110. 字符串接龙 代码实现 import collectionsn int(input()) beginStr, endStr input().split() strList [input() for _ in range(n)]deque collections.deque() # 使用队列遍历结点 deque.append([beginStr, 1]) # 存储当前字符串和遍…

【UE5】RTS游戏的框选功能+行军线效果实现

目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 四、行军线效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGam…

设计模式 四、行为设计模式(2)

五、状态模式 1、概述 状态设计模式是一种行为型设计模式&#xff0c;它允许对象在其内部状态发生时改变其行为&#xff0c;这种模式可以消除大量的条件语句&#xff0c;并将每个状态的行为封装到单独的类中。 状态模式的主要组成部分如下&#xff1a; 1&#xff09;上…

FEA 仿真助力高速连接器设计中的信号完整性

各行各业高速信号软件和硬件的快速发展&#xff0c;带来了更高的频率和带宽。因此&#xff0c;对连接器组件的整体性能要求也更加严格。同时&#xff0c;器件和封装形式、互连以及系统内其他设备的小型化也带来了额外的设计挑战。所有这些都对信号传输完整性产生重大影响。 高速…

yum的基本操作和vim指令

在我们的手机端或者Windows上下载软件&#xff0c;可以在相应的应用商店或者官网进行下载&#xff0c;这样对于用户来说十分的方便和便捷。而在Linux上&#xff0c;也有类似的安装方式&#xff0c;我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…

Qt触摸屏隐藏鼠标指针

Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 使用Qt开发的屏幕软件HMI不需要显示鼠标&#xff0c;qt设置&#xff0c;可以在只启动HMI的时候隐藏光标&#xff0c;退出时再显示。 1.如果只希望在某个 widget 中不显示鼠标指针&#xf…

LangGraph——Agent AI的持久化状态

LangGraph 内置了一个持久化层&#xff0c;通过检查点(checkpointer)机制实现。当你使用检查点器编译图时&#xff0c;它会在每个超级步骤(super-step)自动保存图状态的检查点。这些检查点被存储在一个线程(thread)中&#xff0c;可在图执行后随时访问。由于线程允许在执行后访…

【双指针】专题:LeetCode 1089题解——复写零

复写零 一、题目链接二、题目三、算法原理1、先找到最后一个要复写的数——双指针算法1.5、处理一下边界情况2、“从后向前”完成复写操作 四、编写代码五、时间复杂度和空间复杂度 一、题目链接 复写零 二、题目 三、算法原理 解法&#xff1a;双指针算法 先根据“异地”操…

【C++初学】C++核心编程(一):内存管理和引用

前言 在C的世界里&#xff0c;面向对象编程&#xff08;OOP&#xff09;是核心中的核心。它不仅是一种编程范式&#xff0c;更是一种思考问题的方式。本文将带你从C的内存分区模型出发&#xff0c;深入探讨引用、函数、类和对象、继承、多态以及文件操作等核心概念。通过丰富的…

(PC+WAP)大气滚屏网站模板 电气电力设备网站源码下载

源码介绍 (PCWAP)大气滚屏网站模板 电气电力设备网站源码下载。PbootCMS内核开发的网站模板&#xff0c;该模板适用于滚屏网站模板、电气电力设备网站源码等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;PCWAP&#xff0c…

笔试专题(九)

文章目录 十字爆破&#xff08;暴力&#xff09;题解代码 比那名居的桃子&#xff08;滑动窗口/前缀和&#xff09;题解代码 分组&#xff08;暴力枚举 优化二分&#xff09;题解代码 十字爆破&#xff08;暴力&#xff09; 题目链接 题解 1. 暴力 预处理 2. 如果单纯的暴…

3 VS Code 配置优化与实用插件推荐:settings.json 详解、CodeGeeX 智能编程助手及插件离线安装方法

1 优化 settings.json 文件 1.1 settings.json 简介 settings.json 是 VS Code 的核心配置文件&#xff0c;用于存储用户的个性化设置和偏好。通过该文件&#xff0c;用户可以自定义和覆盖 VS Code 的默认行为&#xff0c;包括但不限于以下方面&#xff1a; 编辑器外观&#…

TA学习之路——1.6 PC手机图形API介绍

1前言 电脑的工作原理&#xff1a;电脑是由各种不同的硬件组成&#xff0c;由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或者间接的使用到驱动。 定义&#xff1a;是一个图形库&#xff0c;用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序接口&#xff08;API)。…

Matlab 调制信号和fft变换

1、内容简介 Matlab 194-调制信号和fft变换 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

100M/1000M 以太网静电浪涌防护方案

方案简介 以太网是一种生产较早且广泛应用的局域网通讯方式&#xff0c;同时也是一种协议&#xff0c;其核 心在于实现区域内&#xff08;如办公室、学校等&#xff09;的网络互联。根据数据传输速度的不同&#xff0c;以 太网大致可以划分为几个等级&#xff1a;标准以太网…

C语言中while的相关题目

一、题目引入 以下程序中,while循环的循环次数是多少次? 二、代码分析 首先要明确的一点 while循环是当循环条件为真 就会一直循环 不会停止 while中i是小于10的 说明i可以取到0 1 2 3 4 5 6 7 8 9 进入第一个if判断i小于1为真时执行continue i0是为真的 执行continue 后…

「Unity3D」图片导入选项取消Read/Write,就无法正确显示导入大小,以及Addressable打包无法正确显示的问题

如果在Edit -> Project Settings -> Editor中的“Load texture data on demand”勾选&#xff0c;就会让图片导入设置中&#xff0c;不勾选Read/Write&#xff0c;就无法正确显示纹理的大小数字。 更进一步的问题是&#xff0c;使用Addressable打包的时候&#xff0c; 如…

Xcode为不同环境配置不同的环境变量

一般有三种方式&#xff1a; 一、通过多Target 二、通过scheme,也就是多configurations 三、通过.xcconfig文件 先来看第二种方式&#xff1a;通过scheme,也就是多configurations,包括自定义User-settings 第一步&#xff1a;增加configurations,Xcode默认为我们生成了…

阿里通义实验室发布图片数字人项目LAM,实现高保真重建

简介 LAM项目结合了3D Gaussian Splatting&#xff08;高斯点云渲染&#xff09;和大规模预训练模型的优势&#xff0c;解决了传统头部重建方法效率低、依赖多数据的痛点。其背景源于AI生成内容&#xff08;AIGC&#xff09;领域对实时、高保真3D头像生成的需求&#xff0c;尤其…

镜像端口及观察端口的配置

配好路由器的各个接口的IP PC1ping PC3的IP&#xff0c;在路由器中抓2/0/0端口的包&#xff0c;可观察到无结果 输入observe-port interface g 2/0/0 命令配置观察端口 输入mirror to observe-port both命令 &#xff08;其中both表示接收来去的数据包&#xff0c;inboun…