【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'交叉驗證R2得分: {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.pswp.cn/diannao/77686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77686.shtml
英文地址,請注明出處:http://en.pswp.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;而這個致敏…