【2025年泰迪杯数据挖掘挑战赛】B题 详细解题思路+数据预处理+代码分享

目录

  • 2025年泰迪杯B题详细解题思路
    • 问题一
      • 问题分析
      • 数学模型
      • Python代码
      • Matlab代码
    • 问题二
      • 问题分析
      • 数学模型
      • Python代码
      • Matlab代码
    • 问题三
      • 问题分析
      • 数学模型
      • Python代码
      • Matlab代码
    • 问题四
      • 问题分析
      • 数学模型
      • Python代码
      • Matlab代码

2025年泰迪杯B题详细解题思路

初步分析整理了B题的赛题分析与解题思路,后面还会更新详细的建模论文与解题代码,明天完成!

问题一

问题分析

需要从附件1的加速度数据中提取MET值,并按强度分类统计时长。核心在于正确处理时间戳间隔和MET区间分类。由于时间戳为毫秒级,需计算相邻时间差并累加至对应活动类别。需注意时间差计算的精度及MET区间的边界条件。

数学模型

在这里插入图片描述

Python代码

import pandas as pd
import re
import osdef process_volunteer(file_path):df = pd.read_csv(file_path)df['日期'] = pd.to_numeric(df['日期'])df = df.sort_values('日期')df['delta'] = df['日期'].diff().shift(-1) / (3600 * 1000)  # 转换为小时df = df.dropna(subset=['delta'])# 提取MET值df['MET'] = df['标签'].apply(lambda x: float(re.search(r'MET值\s*([0-9.]+)', x).group(1)))# 分类统计bins = [-float('inf'), 1, 1.6, 3, 6, float('inf')]labels = ['睡眠', '静态活动', '低等强度', '中等强度', '高等强度']df['category'] = pd.cut(df['MET'], bins=bins, labels=labels, right=False)result = df.groupby('category')['delta'].sum().to_dict()return {'志愿者ID': os.path.basename(file_path).split('.')[0],'记录总时长(小时)': round(df['delta'].sum(), 4),'睡眠总时长(小时)': round(result.get('睡眠', 0), 4),'高等强度运动总时长(小时)': round(result.get('高等强度', 0), 4),'中等强度运动总时长(小时)': round(result.get('中等强度', 0), 4),'低等强度运动总时长(小时)': round(result.get('低等强度', 0), 4),'静态活动总时长(小时)': round(result.get('静态活动', 0), 4)}# 主程序
metadata = pd.read_csv('Metadatal.csv')
results = []
for vid in metadata['志愿者ID']:file_path = f'附件1/P{vid}.csv'if os.path.exists(file_path):res = process_volunteer(file_path)results.append(res)pd.DataFrame(results).to_excel('result_1.xlsx', index=False)

Matlab代码

function B1()dataDir = '附件1/';meta = readtable('Metadatal.csv');results = cell(height(meta), 7);for i = 1:height(meta)vid = meta.志愿者ID{i};file = [dataDir 'P' vid '.csv'];if ~exist(file, 'file'), continue; end% 读取数据并排序tbl = readtable(file);tbl.日期 = str2double(tbl.日期);[~, idx] = sort(tbl.日期);tbl = tbl(idx, :);% 计算时间差delta = diff(tbl.日期) / (3600 * 1000); % 转换为小时met = zeros(length(delta), 1);for j = 1:length(delta)metStr = tbl.标签{j};metVal = regexp(metStr, 'MET值\s*([0-9.]+)', 'tokens', 'once');met(j) = str2double(metVal{1});end% 分类统计edges = [-inf, 1, 1.6, 3, 6, inf];[~, bin] = histc(met, edges);total = sum(delta);counts = accumarray(bin, delta, [5, 1], @sum, 0);% 保存结果results(i, :) = {vid, total, counts(1), counts(5), counts(4), counts(3), counts(2)};end% 输出到ExcelT = cell2table(results, 'VariableNames', {'志愿者ID', '总时长', '睡眠', '高等', '中等', '低等', '静态'});writetable(T, 'result_1.xlsx');
end

问题二

问题分析

需构建回归模型预测MET值。输入特征包括三轴加速度的时域、频域统计量及元数据(年龄、性别)。模型需捕捉加速度与MET值的非线性关系。

数学模型

在这里插入图片描述
在这里插入图片描述

Python代码

import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_scoredef extract_features(data):x = data['X'].valuesy = data['Y'].valuesz = data['Z'].valuesvm = np.sqrt(x**2 + y**2 + z**2)# 时域特征features = {'x_mean': np.mean(x), 'x_std': np.std(x),'y_mean': np.mean(y), 'y_std': np.std(y),'z_mean': np.mean(z), 'z_std': np.std(z),'vm_mean': np.mean(vm), 'vm_std': np.std(vm),'vm_rms': np.sqrt(np.mean(vm**2))}# 频域特征for axis, sig in zip(['x', 'y', 'z'], [x, y, z]):fft = np.abs(np.fft.rfft(sig))features[f'{axis}_energy'] = np.sum(fft**2)return features# 训练数据准备
metadata = pd.read_csv('Metadatal.csv')
X, y = [], []
for vid in metadata['志愿者ID']:df = pd.read_csv(f'附件1/P{vid}.csv')df['MET'] = df['标签'].str.extract(r'MET值\s*([0-9.]+)').astype(float)# 滑动窗口处理(窗口5秒)window_size = 5for i in range(0, len(df
) - window_size, window_size):window = df.iloc[i:i+window_size]feat = extract_features(window)feat['age'] = metadata.loc[metadata['志愿者ID'] == vid, '年龄'].values[0]feat['gender'] = 1 if metadata.loc[metadata['志愿者ID'] == vid, '性别'].values[0] == '男' else 0X.append(feat)y.append(window['MET'].mean())# 训练模型
model = RandomForestRegressor(n_estimators=100)
scores = cross_val_score(model, pd.DataFrame(X), y, cv=5, scoring='r2')
print(f'交叉验证R²得分: {np.mean(scores):.4f}')
model.fit(pd.DataFrame(X), y)# 预测附件2数据

Matlab代码

function B2()% 特征提取函数function feat = extractFeatures(x, y, z)vm = sqrt(x.^2 + y.^2 + z.^2);feat = [mean(x), std(x), mean(y), std(y), mean(z), std(z), ...mean(vm), std(vm), rms(vm), sum(abs(fft(x)).^2), ...sum(abs(fft(y)).^2), sum(abs(fft(z)).^2)];end% 加载数据meta = readtable('Metadatal.csv');X = []; y = [];for i = 1:height(meta)file = ['附件1/P' meta.志愿者ID{i} '.csv'];tbl = readtable(file);met = cellfun(@(s) str2double(regexp(s, 'MET值\s*([0-9.]+)', 'tokens', 'once')), tbl.标签);% 滑动窗口处理winSize = 5;  % 5秒窗口for j = 1:winSize:height(tbl)-winSizex = tbl.X(j:j+winSize-1);y_axis = tbl.Y(j:j+winSize-1);z = tbl.Z(j:j+winSize-1);feat = extractFeatures(x, y_axis, z);X = [X; feat meta.年龄(i) strcmp(meta.性别{i}, '男')];y = [y; mean(met(j:j+winSize-1))];endend% 训练随机森林model = TreeBagger(100, X, y, 'Method', 'regression');% 预测附件2
end

问题三

问题分析

睡眠阶段通过低活动量时段检测。计算向量幅度(VM)的滑动窗口均值,低于阈值视为睡眠候选,进一步聚类划分模式。

数学模型

活动量计算:
[
VM(t) = \sqrt{x(t)^2 + y(t)^2 + z(t)^2}
]
睡眠窗口检测:
[
W_{\text{sleep}} = { t \mid \overline{VM}(t) < \theta }
]
K-means聚类:
目标函数为最小化类内平方和:
[
\min \sum_{k=1}^K \sum_{\mathbf{x} \in C_k} | \mathbf{x} - \mathbf{\mu}_k |^2
]
其中 ( \mathbf{\mu}_k ) 为窗口特征 ( \mathbf{x} ) 的聚类中心。

Python代码

from sklearn.cluster import KMeansdef detect_sleep(file_path):df = pd.read_csv(file_path)df['vm'] = np.sqrt(df['X']**2 + df['Y']**2 + df['Z']**2)# 滑动窗口检测低活动(30秒窗口)window_size = 30df['window'] = df.index // window_sizeactivity = df.groupby('window')['vm'].mean()sleep_windows = activity[activity < 0.1].index# 提取窗口特征features = []for win in sleep_windows:win_data = df[df['window'] == win]vm_mean = win_data['vm'].mean()vm_std = win_data['vm'].std()features.append([vm_mean, vm_std])# K-means聚类if len(features) == 0:return {'睡眠总时长': 0.0, '模式一': 0.0, '模式二': 0.0, '模式三': 0.0}kmeans = KMeans(n_clusters=3).fit(features)labels = kmeans.labels_counts = np.bincount(labels, minlength=3)hours = counts * window_size / 3600  # 转换为小时return {'睡眠总时长': round(np.sum(hours), 4),'模式一': round(hours[0], 4),'模式二': round(hours[1], 4),'模式三': round(hours[2], 4)}# 处理附件2并保存结果

Matlab代码

function B3()function [total, modes] = detectSleep(file)tbl = readtable(file);vm = sqrt(tbl.X.^2 + tbl.Y.^2 + tbl.Z.^2);% 检测低活动窗口(30秒窗口)winSize = 30;numWin = floor(height(tbl)/winSize);act = zeros(numWin, 1);for i = 1:numWinidx = (i-1)*winSize + 1 : i*winSize;act(i) = mean(vm(idx));endsleepWins = find(act < 0.1);% 提取特征并聚类features = zeros(length(sleepWins), 2);for j = 1:length(sleepWins)idx = (sleepWins(j)-1)*winSize + 1 : sleepWins(j)*winSize;vmWin = vm(idx);features(j, :) = [mean(vmWin), std(vmWin)];endif isempty(features)total = 0; modes = zeros(1,3);else[~, C] = kmeans(features, 3);counts = histcounts(C, 1:4);total = sum(counts) * winSize / 3600;modes = counts * winSize / 3600;endend% 应用至附件2(略)
end

问题四

问题分析

检测连续静态活动(MET<1.6)超过30分钟的时段。遍历预测的MET序列,记录连续满足条件的时段。

数学模型

设MET序列为 ( MET(t) ),窗口步长 ( \Delta t )(单位:分钟),久坐判定条件为:
[
\sum_{i=t}^{t+\Delta t} MET(i) < 1.6 \quad \text{且} \quad \Delta t \geq 30
]

Python代码

def sedentary_alert(met_series, window_min=5):delta = window_min / 60  # 转换为小时sedentary = []current_duration = 0.0start_idx = Nonefor i, met in enumerate(met_series):if met < 1.6:current_duration += deltaif start_idx is None:start_idx = ielse:if current_duration >= 0.5:  # 0.5小时=30分钟end_idx = i - 1sedentary.append((start_idx, end_idx, current_duration))current_duration = 0.0start_idx = Noneif current_duration >= 0.5:sedentary.append((start_idx, len(met_series)-1, current_duration))return sedentary# 应用至附件2预测结果

Matlab代码

function B4()function alerts = detectSedentary(met, winSize)delta = winSize / 60;  % 窗口分钟转小时alerts = [];start = 1; count = 0;for i = 1:length(met)if met(i) < 1.6count = count + delta;if isempty(start), start = i; endelseif count >= 0.5  % 0.5小时=30分钟alerts = [alerts; [start, i-1, count]];endcount = 0;start = [];endendif count >= 0.5alerts = [alerts; [start, length(met), count]];endend% 应用至附件2(略)
end

完整论文代码获取,请看下方~ 可直接指导比赛,冲国奖

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

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

相关文章

SpringBoot3快速入门笔记

springboot3简介 SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用&#xff08;说明&#xff1a;SpringBoot底层是Spring&#xff09; 大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术 特性&#xff1a; ● 快速创建…

记录centos8安装宝塔过程(两个脚本)

1、切换系统源&#xff08;方便使用宝塔安装脚本下载&#xff09; bash <(curl -sSL https://linuxmirrors.cn/main.sh) 2、宝塔安装脚本在宝塔的官网 宝塔面板下载&#xff0c;免费全能的服务器运维软件 根据自己的系统选择相应的脚本 urlhttps://download.bt.cn/insta…

Xdocreport实现根据模板导出word

只使用freemaker生成简单的word文档很容易&#xff0c;但是当word文档需要插入动态图片&#xff0c;带循环数据&#xff0c;且含有富文本时解决起来相对比较复杂&#xff0c;但是使用Xdocreport可以轻易解决。 Xdocreport既可以实现文档填充也可以实现文档转换&#xff0c;此处…

VMware Fusion Pro/Player 在 macOS 上的完整安装与使用指南

VMware Fusion Pro/Player 在 macOS 上的完整安装与使用指南—目录 一、VMware 产品说明二、下载 VMware Fusion三、安装前准备四、安装 VMware Fusion步骤 1&#xff1a;安装程序步骤 2&#xff1a;首次启动配置步骤 3&#xff1a;输入许可证 五、创建虚拟机步骤 1&#xff1a…

Redis常用数据结构和应用场景

一、前言 Redis提供了多种数据结构&#xff0c;每种结构对应不同的应用场景。本文对部分常用的核心数据结构和典型使用场景作出介绍。 二、String&#xff08;字符串&#xff09; 特点&#xff1a;二进制安全&#xff0c;可存储文本、数字、序列化对象等。场景&#xff1a; 缓…

spring security oauth2.0的四种模式

OAuth 2.0 定义了 4 种授权模式&#xff08;Grant Type&#xff09;&#xff0c;用于不同场景下的令牌获取。以下是每种模式的详细说明、适用场景和对比&#xff1a; 一、授权码模式&#xff08;Authorization Code Grant&#xff09; 适用场景 • Web 应用&#xff08;有后端…

Oracle 排除交集数据 MINUS

MINUS 是 Oracle 数据库中的一种集合操作符&#xff0c;用于返回第一个查询结果中存在但第二个查询结果中 不存在 的 唯一行。其核心功能是 排除交集数据&#xff0c;常用于数据差异分析或过滤特定记录 一、核心功能 排除交集&#xff1a;返回第一个查询结果中 不在第二个查询结…

WiFi那些事儿(四)

目录 一、IEEE 802.11ah标准简介 二、IEEE 802.11ah信道特点 三、IEEE 802.11ah传输模式 在WiFi通信领域&#xff0c;信号绕射能力一直是一个关键问题。常规的WiFi设备多工作在2.4GHz和5GHz频段&#xff0c;这些频段的电磁波波长通常小于障碍物尺寸&#xff0c;受电磁波本身…

C++在Linux上生成动态库并调用接口测试

加减乘除demo代码 项目结构 CPP/ ├── calculator.cpp ├── calculator.h ├── main.cpp 头文件 #ifndef CALCULATOR_H #define CALCULATOR_H#ifdef __cplusplus extern "C" {#endifdouble add(double a, double b);double subtract(double a, double b…

离线密码生成器:安全可靠的密码管理解决方案

离线密码生成器&#xff1a;安全可靠的密码管理解决方案 在当今数字时代&#xff0c;我们每天都需要使用各种网站和应用程序&#xff0c;每个账户都需要一个强密码来保护我们的个人信息和隐私。然而&#xff0c;记住多个复杂的密码几乎是不可能的任务。今天&#xff0c;我要向…

ChatRex: Taming Multimodal LLM for Joint Perception and Understanding 论文理解和翻译

一、TL&#xff1b;DR MLLM在感知方面存在不足&#xff08;远远比不上专家模型&#xff09;&#xff0c;比如Qwen2-VL在coco上recall只有43.9%提出了ChatRex&#xff0c;旨在从模型设计和数据开发两个角度来填补这一感知能力的缺口ChatRex通过proposal边界框输入到LLM中将其转…

自动驾驶技术-相机_IMU时空标定

自动驾驶技术-相机_IMU时空标定 时间延迟 时间延迟 参考链接1、2 相机主要分为全局和卷帘快门相机&#xff0c;从触发到成像的过程包括&#xff1a;复位时间、AE()曝光时间、读出时间 全局快门如下图所示 卷帘快门如下图所示 相机录制视频时&#xff0c;为了保持固定频率&am…

Vue3 + Vite + TS,使用 Web Worker,web worker进阶 hooks

worker 具体通讯方式 1.由 web page 发送消息- worker.postMessage(发送数据) 2.web worker 接收消息并执行相关逻辑- onmessage (e) > { 接收数据并处理逻辑postMessage(传递处理后的数据)} 3.由 web page 监听 worker 消息&#xff0c;包括&#xff1a;- 处理数据的监听…

AIDD-人工智能药物设计-AI 精准预测蛋白质变构位点

Allo-PED: AI 精准预测蛋白质变构位点 目录 Allo-PED 框架融合蛋白质语言模型与结构特征,显著提高了变构位点预测的准确性和泛化能力。EcoFoldDB 利用蛋白质结构信息,为宏基因组提供了精确且可扩展的生态功能注释新方法,显著提升了对未知微生物功能的认知。上下文分子适配(…

1558 找素数

1558 找素数 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;质数 &#x1f4d6; &#x1f4da; import java.util.Scanner; import java.util.Arrays;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int a sc.…

Nacos 提供了哪些服务的保护机制?

当面试官问这个问题时&#xff0c;大家一定要保持头脑清醒&#xff0c;不要被带跑偏了&#xff0c;Nacos 本身的核心定位是服务发现和配置管理中心&#xff0c;它并不直接提供像服务熔断、服务限流、服务降级、请求重试 这类完整的、开箱即用的客户端/网关级服务保护&#xff0…

【家政平台开发(38)】解锁家政平台国际化密码:多语言支持开发实战

> 本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质…

DirectX12 - 基本知识 - 图形驱动的本质

这里是SunshineBooming&#xff0c;GPU公司一枚小小的Driver工程师&#xff0c;主要工作是写DirectX12 Driver&#xff0c;我会持续更新这个DX12 Spec系列&#xff0c;可能比较冷门&#xff0c;但是都是干货和工作中的心得体会&#xff0c;有任何GPU相关的问题都可以在评论区互…

selenium元素获取

from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Chrome()driver.maximize_window()#最大化窗口 #隐式等待 driver.implicitly_wait(10)#打开网页 driver.get("https://www.zhipin.com/beijing/?kacity-sites-101010100&q…

生物化学笔记:医学免疫学原理15 超敏反应过敏反应(I型[蚊虫叮咬]+II型[新生儿溶血症、突眼型甲亢]+III型+IV型)

超敏反应 每个人都可能发生的过敏问题&#xff1a;被蚊子咬后起包 I型超敏反应 II型超敏反应 新生儿溶血症分为Rh血型不合和ABO血型不合两种情况。Rh血型不合通常从第二胎开始更容易发病&#xff0c;因为母体初次接触Rh阳性胎儿的红细胞后会产生抗D抗体&#xff0c;而这个致敏…