目录
- [2025年泰迪杯数据挖掘挑战赛 B题](#2025年泰迪杯数据挖掘挑战赛 B题)
- [完整论文:建模与求解 Matlab代码](#完整论文:建模与求解 Matlab代码)
- 一、问题重述
- 二、模型假设与符号说明
-
- [2.1 模型基本假设](#2.1 模型基本假设)
- [2.2 符号说明](#2.2 符号说明)
- 三、数据预处理
- **问题一:志愿者身体活动信息的统计分析**
- **问题二:身体活动MET值的实时估计模型构建**
- **问题三:睡眠阶段的智能识别算法开发**
- **问题四:久坐行为的自动预警系统设计**
2025年泰迪杯数据挖掘挑战赛 B题
完整论文:建模与求解 Matlab代码
一、问题重述
随着可穿戴设备的普及,利用其内置微机电系统(MEMS)加速度计数据监测用户身体活动已成为医学与健康管理领域的重要研究方向。本课题基于穿戴设备采集的加速度计数据,旨在解决以下核心问题:
第一,志愿者身体活动信息的统计分析。要求对附件1中100名志愿者的加速度数据进行处理与分类,按时间维度统计其总记录时长、睡眠时长及各强度运动(高、中、低强度)与静态活动的持续时间,最终生成结构化汇总表(result_1.xlsx)。需解决的核心难点在于高效处理大规模数据并准确划分活动类别,其中MET值的阈值划分(如MET≥6.0为高强度)为分类依据。
第二,身体活动MET值的实时估计模型构建。需基于附件1中志愿者的性别、年龄、时间及三轴加速度数据,建立机器学习模型以预测个体在任意时间段的MET值,并确保模型兼具准确性与泛化能力。完成模型训练后,需对附件2中20名志愿者的数据进行MET值预测,进一步汇总其运动强度分布(result_2.xlsx)。关键挑战在于特征工程的设计(如年龄分段、时间编码、加速度模长计算)及模型选择(如BPNN、CNN、RF)。
第三,睡眠阶段的智能识别算法开发。要求设计一种基于加速度数据的睡眠阶段分类方法,准确识别附件2中20名志愿者的睡眠总时长及不同睡眠模式(如深度睡眠、浅层睡眠、觉醒阶段)的分布,结果汇总至result_3.xlsx。需解决的核心问题包括睡眠信号的噪声抑制、模式划分的生理学依据及算法鲁棒性验证。
第四,久坐行为的自动预警系统设计。需基于附件1数据定义久坐行为(连续静态活动≥30分钟且MET<1.6),构建算法以识别此类行为并触发预警机制。最终将方法应用于附件2数据,输出具体久坐时段及预警记录。技术难点在于连续时段的动态监测、阈值判定的实时性及预警逻辑的合理性。
上述任务的解决需紧密结合数据预处理、特征提取、模型优化及结果可视化,为可穿戴设备在健康监测中的实际应用提供系统性解决方案。
二、模型假设与符号说明
2.1 模型基本假设
本研究基于以下假设展开建模与分析:
数据完整性假设:原始加速度计数据的时间戳连续且无大规模缺失,所有传感器记录的时间精度误差可忽略;
生理活动相关性假设:三轴加速度信号的幅值与方向变化能有效表征人体运动的强度与模式,且MET值标签与加速度特征存在稳定的映射关系;
独立同分布假设:不同志愿者的活动数据在特征空间中服从相同分布,模型可通过训练集学习到泛化规律;
线性可分性假设:睡眠阶段与久坐行为可通过特征工程与分类器实现高精度区分,数据噪声对分类边界的影响可被模型鲁棒性抵消;
时间局部性假设:连续时段的加速度信号具有时间相关性,滑动窗口统计量可有效捕捉活动模式的动态变化。
2.2 符号说明

三、数据预处理

以下是对文档中每一问的求解过程与思路的梳理:
问题一:志愿者身体活动信息的统计分析
目标 :对附件1中100名志愿者的加速度数据进行处理与分类,统计其总记录时长、睡眠时长及各强度运动(高、中、低强度)与静态活动的持续时间,并生成结构化汇总表(result_1.xlsx)。
求解思路:
- 数据预处理 :
- 加载数据,将时间戳转换为
datetime
格式。 - 计算相邻时间点的时间差(单位:小时),用于后续统计各活动时长。
- 加载数据,将时间戳转换为
- MET值分类 :
- 根据MET值的阈值划分活动类型:
- 睡眠:MET < 1
- 静态活动:1 ≤ MET < 1.6
- 低强度运动:1.6 ≤ MET < 3.0
- 中等强度运动:3.0 ≤ MET < 6.0
- 高强度运动:MET ≥ 6.0
- 根据MET值的阈值划分活动类型:
- 统计各活动时长 :
- 遍历每个志愿者的数据,根据上述分类统计各活动类型的持续时间。
- 将总记录时长及各活动时长存储到结果矩阵中。
- 生成汇总表 :
- 将结果矩阵转换为表格格式,包含志愿者ID及各项活动时长。
- 保存到Excel文件
result_1.xlsx
中。
- 可视化 :
- 绘制堆叠柱状图,展示每位志愿者的活动构成。
- 绘制热力图,反映各活动类型在所有志愿者中的分布情况。
- 绘制饼图,展示总体活动类型的占比。
关键代码片段:
matlab
% 统计各活动时长
for i = 1:n
T = A1{i};
T.time = datetime(T.time, 'InputFormat','yyyy-MM-dd HH:mm:ss.SSS');
dt = [seconds(diff(T.time)); 0] / 3600;
MET = T.MET;
total_time = sum(dt);
sleep_time = sum(dt(MET < 1));
static_time = sum(dt(MET >= 1 & MET < 1.6));
low_time = sum(dt(MET >= 1.6 & MET < 3.0));
medium_time = sum(dt(MET >= 3.0 & MET < 6.0));
high_time = sum(dt(MET >= 6.0));
volunteerIDs{i} = ['P' num2str(i)];
result(i,:) = round([total_time, sleep_time, high_time, medium_time, low_time, static_time], 4);
end
问题二:身体活动MET值的实时估计模型构建
目标 :基于附件1中志愿者的性别、年龄、时间及三轴加速度数据,建立机器学习模型以预测个体在任意时间段的MET值,并确保模型兼具准确性与泛化能力。完成模型训练后,对附件2中20名志愿者的数据进行MET值预测,进一步汇总其运动强度分布(result_2.xlsx)。
求解思路:
- 特征提取 :
- 提取个体属性特征(年龄、性别)和时间信息特征(记录时刻)。
- 计算加速度的模长作为运动强度的综合指标。
- 数据划分 :
- 将数据划分为训练集、验证集和测试集。
- 模型构建与训练 :
- 构建BP神经网络、卷积神经网络(CNN)和随机森林(RF)三种模型。
- 使用训练集训练模型,并在验证集上调整超参数。
- 模型评估与选择 :
- 在测试集上评估各模型的性能,使用均方误差(MSE)、平均绝对误差(MAE)和平均绝对百分比误差(MAPE)作为评价指标。
- 选择性能最优的模型(随机森林)。
- 预测与结果汇总 :
- 使用选定的模型对附件2中20名志愿者的数据进行MET值预测。
- 统计各志愿者的运动强度分布,生成汇总表
result_2.xlsx
。
- 可视化 :
- 绘制预测值与真实值的对比图。
- 绘制残差分析图和预测-真实散点图。
关键代码片段:
matlab
% 随机森林模型训练
Mdl = TreeBagger(num_tree, train_x_feature_label_norm, train_y_feature_label, ...
'Method', 'regression', 'OOBPredictorImportance', 'on');
test_out = predict(Mdl, test_x_feature_label_norm);
mse_RF = mse(test_out - test_y_feature_label_norm);
mae_RF = mean(abs(test_y_feature_label_norm - test_out));
mape_RF = mean(abs((test_y_feature_label_norm - test_out) ./ test_y_feature_label_norm));
问题三:睡眠阶段的智能识别算法开发
目标 :设计一种基于加速度数据的睡眠阶段分类方法,准确识别附件2中20名志愿者的睡眠总时长及不同睡眠模式(如深度睡眠、浅层睡眠、觉醒阶段)的分布,结果汇总至result_3.xlsx
。
求解思路:
- 特征提取 :
- 计算加速度模量的滑动均值和标准差,作为局部特征。
- 聚类分析 :
- 使用K-means聚类算法对睡眠数据进行无监督分类,将睡眠划分为三种模式。
- 模型训练与优化 :
- 使用支持向量机(SVM)对聚类结果进行监督学习,进一步优化分类性能。
- 预测与结果汇总 :
- 对附件2中20名志愿者的睡眠数据进行预测,统计各睡眠模式的时长。
- 生成汇总表
result_3.xlsx
。
- 可视化 :
- 绘制各志愿者的睡眠模式变化图。
关键代码片段:
matlab
% SVM模型训练
t = templateSVM('Standardize', true, 'KernelFunction', 'gaussian');
Mdl = fitcecoc(train_x_feature_label_norm, train_y_feature_label, 'Learners', t);
[~, score_test] = predict(Mdl, test_x_feature_label_norm);
[~, y_test_predict] = max(score_test');
accuracy_test = sum(diag(confusionmat(test_y_feature_label, y_test_predict))) / ...
sum(confusionmat(test_y_feature_label, y_test_predict) (:));
问题四:久坐行为的自动预警系统设计
目标 :基于附件1数据定义久坐行为(连续静态活动≥30分钟且MET<1.6),构建算法以识别此类行为并触发预警机制。最终将方法应用于附件2数据,输出具体久坐时段及预警记录。
求解思路:
- 数据预处理 :
- 加载数据,标记静坐行为(MET < 1.6)。
- 久坐行为检测 :
- 遍历每个志愿者的数据,检测连续静坐时间。
- 若静坐时间超过30分钟,记录为"FULL"预警;若接近25分钟,记录为"APPROACHING"预警。
- 模型训练与优化 :
- 使用SVM对静坐行为进行识别,确保模型的准确性和泛化能力。
- 预警与结果汇总 :
- 对附件2中20名志愿者的数据进行久坐行为检测,记录预警信息。
- 统计各志愿者的预警次数,生成汇总表。
- 可视化 :
- 绘制各志愿者的久坐预警次数条形图。
- 绘制时间线图,展示具体的久坐时段。
关键代码片段:
matlab
% 久坐行为检测
for i = 1:nVolunteers
T = A2_result_q4{i};
T.time = datetime(T.time, 'InputFormat', 'yyyy-MM-dd HH:mm:ss');
T = sortrows(T, 'time');
sit = T.isSit;
extSit = [0; sit(:); 0];
diffSit = diff(extSit);
startIdx = find(diffSit == 1);
endIdx = find(diffSit == -1) - 1;
for j = 1:length(startIdx)
t_start = T.time(startIdx(j));
t_end = T.time(endIdx(j));
dt = seconds(t_end - t_start);
if dt >= full_threshold
fprintf('久坐:志愿者 %d 从 %s 到 %s 久坐 %.0f 秒 [FULL]\n', ...
i + 100, char(t_start), char(t_end), dt);
warningRecords(end + 1).volunteer = i;
warningRecords(end).startTime = t_start;
warningRecords(end).endTime = t_end;
warningRecords(end).duration = dt;
warningRecords(end).warningType = 'full';
fullWarnCount(i) = fullWarnCount(i) + 1;
elseif dt >= approach_threshold
fprintf('预警(接近):志愿者 %d 从 %s 到 %s 已久坐 %.0f 秒 [APPROACHING]\n', ...
i + 100, char(t_start), char(t_end), dt);
warningRecords(end + 1).volunteer = i;
warningRecords(end).startTime = t_start;
warningRecords(end).endTime = t_end;
warningRecords(end).duration = dt;
warningRecords(end).warningType = 'approaching';
approachWarnCount(i) = approachWarnCount(i) + 1;
end
end
end
完整论文,请看下方