2025高教社杯全国大学生数学建模竞赛(E题)深度剖析| 立定跳远运动 |数学建模完整代码+建模过程全解全析
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题!CS团队倾注了大量时间和心血,深入挖掘解决方案。通过网络流,动态最短路径,多目标优化等算法,设计了明晰的项目,团队努力体现在每个步骤,确保方案既创新又可行,为大家提供了全面而深入的洞见噢~让我们来看看国赛(E题)!完整内容可以在文章末尾领
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题!
CS团队倾注了大量时间和心血,深入挖掘解决方案。通过网络流,动态最短路径,多目标优化等算法,设计了明晰的项目,团队努力体现在每个步骤,确保方案既创新又可行,为大家提供了全面而深入的洞见噢~
让我们来看看国赛(E题)!
完整内容可以在文章末尾领取!
这是一个聚类分析问题,核心目标是通过对立定跳远运动过程中采集到的关键点位置数据进行分析,识别出运动者在跳远过程中的关键时间节点(起跳与落地时刻),并刻画滞空阶段的运动轨迹特征。该问题的本质在于从大量视频帧中提取并组织人体关键节点的时间序列信息,进而通过聚类方法识别出具有特定运动状态的时段,从而完成对整个跳远动作的解析。
为什么这样判断?可以从以下几个特征点来说明:
(1)题干强调了“通过摄像头拍摄的图像,利用AI人体姿态估计技术可以定位复杂场景中小尺度人体的关键点位置”,并指出这些关键点在不同帧中的位置坐标数据已经给出。这表明原始输入数据是以时间序列的方式记录下来的,每个时间点包含多个关键节点的空间坐标,属于高维时序数据集。
(2)题干明确要求“确定运动者在跳远过程中的起跳和落地时刻”,并且要“描述滞空阶段的运动过程”。这里的“起跳”“落地”以及“滞空阶段”都是基于动作行为的时间划分点,而这些划分点的识别需要借助于对人体姿态变化模式的理解。由于每个关键节点在不同帧中都有坐标信息,因此可以通过观察这些节点随时间的变化趋势,找出某些关键动作发生的时间点。
(3)题干提到“33个关键节点”用于描述整个跳远过程,这些节点包括头部、肩膀、肘部、手腕、髋部、膝盖、脚踝等多个部位。在运动过程中,这些节点的运动轨迹会表现出明显的阶段性特征,例如起跳前的准备动作、起跳瞬间的身体姿态、空中腾空的姿态变化以及落地瞬间的动作调整等。这种阶段性的运动特征非常适合使用聚类方法来进行建模与分析。
(4)题干指出“通过AI人体姿态识别算法,可以获得人体关键节点在运动过程中不同帧的运动视频和位置坐标信息”,这意味着原始数据已经经过预处理,得到了可用于建模的关键特征向量。这些特征向量可以在时间轴上进行聚类处理,从而识别出不同动作阶段的帧集合。
(5)题干中所涉及的“滞空阶段”是一个连续的过程,它涉及到从起跳到落地之间的所有中间状态。为了准确刻画这一阶段,需要对整个时间段内的关键点轨迹进行聚类分析,找出哪些帧属于起跳前、起跳中、腾空阶段、落地中和落地后等不同的类别。这正是聚类分析擅长处理的任务:将具有相似行为模式的数据点归为一类。
(6)从方法论角度出发,题目中提到的“33个关键节点”提供了丰富的维度信息,每一帧都可以表示为一个三维或二维坐标组成的向量。将这些向量按照时间顺序排列后,就可以构建出一个高维时序数据矩阵。在此基础上,可以采用K
means、层次聚类或DBSCAN等聚类算法,对这些时间序列数据进行聚类,从而自动识别出不同动作阶段的起止时刻。
(7)题干中还隐含着一种需求:“帮助教师全面了解每个学生动作的优点和不足,从而给出针对性的改进方案”。这意味着最终的结果不仅限于时间节点的判断,还需要能够反映出动作过程中各关键节点的变化趋势和整体形态。因此,聚类结果应当具备良好的可解释性,使得教师可以根据聚类结果直观地理解学生的动作表现。
综上所述,本题本质上是一个基于人体姿态关键点坐标的时序聚类问题。它要求通过聚类方法挖掘出跳远过程中各个阶段的特征,并据此确定起跳与落地时刻,进而完整描述滞空阶段的运动过程。其核心挑战在于如何从高维、非线性的姿态数据中提取有效的特征并进行合理分组,使聚类结果能够真实反映动作行为的本质属性。因此,该问题的类型可以明确识别为“聚类分析与动作识别问题”,其数学建模重点在于如何利用聚类算法处理人体姿态时序数据,并从中提取具有实际意义的动作阶段划分信息。
问题1:立定跳远运动者起跳与落地时刻识别及滞空阶段分析
一、问题理解与建模思路
本题需要根据给定的33个关键节点位置信息,确定立定跳远运动员的起跳时刻和落地时刻,并描述其滞空阶段的运动过程。主要涉及以下步骤:
- 数据预处理:对原始视频帧中获取的关键节点坐标进行时间序列对齐和去噪处理。
- 特征提取:通过垂直位移变化率识别起跳时刻;通过节点高度与速度判断落地时刻。
- 时间序列建模:建立基于关键节点位姿变化的时间序列模型。
- 聚类分析:使用K
means和DBSCAN算法对滞空阶段的关键点轨迹进行聚类分析。 - 运动过程描述:分析起跳瞬间腿部发力动作、腾空阶段身体姿态变化以及落地姿势稳定性。
二、数据预处理
1. 数据结构说明
输入数据包括:
视频帧编号(时间戳)
每帧中33个关键节点的二维坐标(xi,yi)(x_i, y_i)(xi,yi),其中i=1,2,...,33i = 1, 2, ..., 33i=1,2,...,33
每个节点对应的身体部位如:脚踝、膝盖、髋关节、肩膀等
2. 时间序列对齐
由于视频可能存在帧率不一致或丢帧情况,需将所有节点的时间戳统一为等间隔采样序列(例如每0.05秒一帧),采用插值法填补缺失值。
设第ttt帧时第kkk个节点的位置为:
Pk(t)=(xk(t),yk(t)) P_k(t) = (x_k(t), y_k(t)) Pk(t)=(xk(t),yk(t))
3. 噪声去除
对于存在异常值的帧(如跳跃时因晃动导致的误检),可使用滑动窗口滤波器(如中值滤波)或者基于统计的方法剔除离群点。
三、特征提取
1. 起跳时刻识别
定义起跳时刻为人体重心垂直方向位移速率显著增加的瞬间。因此我们选取以下关键节点:
足部节点(如左脚踝、右脚踝)作为地面接触点
身体中心节点(如腰部或臀部节点)
计算每帧的垂直速度vy(t)v_y(t)vy(t)和加速度ay(t)a_y(t)ay(t):
vy(t)=ycenter(t+1)ycenter(t)Δt v_y(t) = \frac{y_{\text{center}}(t+1) y_{\text{center}}(t)}{\Delta t} vy(t)=Δtycenter(t+1)ycenter(t)
ay(t)=vy(t+1)vy(t)Δt a_y(t) = \frac{v_y(t+1) v_y(t)}{\Delta t} ay(t)=Δtvy(t+1)vy(t)
其中ycenter(t)y_{\text{center}}(t)ycenter(t)表示身体中心节点在第ttt帧的垂直坐标。
通过观察ay(t)a_y(t)ay(t)的峰值来识别起跳时刻。通常起跳发生在ay(t)a_y(t)ay(t)出现突增前后的某个时刻。
2. 落地时刻识别
落地时刻定义为身体重心下降至最低点并开始回升的时刻。可以通过以下方式识别:
使用脚踝节点的垂直坐标yfoot(t)y_{\text{foot}}(t)yfoot(t)
判断其是否达到最小值且随后上升
结合速度vy(t)v_y(t)vy(t)是否由负变正
即:当yfoot(t)y_{\text{foot}}(t)yfoot(t)最小且vy(t)v_y(t)vy(t)从负转正时,认为是落地时刻。
四、时间序列建模
1. 基于关键节点位姿变化判断起跳时刻
我们构建一个基于人体姿态变化的动态模型,定义如下指标:
垂直位移变化率:Δyk(t)=yk(t+1)yk(t)\Delta y_k(t) = y_k(t+1) y_k(t)Δyk(t)=yk(t+1)yk(t)
角速度:ωk(t)=arctan(yk(t+1)yk(t)xk(t+1)xk(t))\omega_k(t) = \arctan\left(\frac{y_k(t+1) y_k(t)}{x_k(t+1) x_k(t)}\right)ωk(t)=arctan(xk(t+1)xk(t)yk(t+1)yk(t))
这些量可以反映人体各部分的运动趋势,用于辅助判断起跳时间点。
2. 基于落地瞬间节点高度与速度判断落地时刻
定义落地时刻为:
tland=argmintyfoot(t),且 vy(t)>0 t_{\text{land}} = \arg\min_{t} y_{\text{foot}}(t), \quad \text{且 } v_y(t) > 0 tland=argtminyfoot(t),且 vy(t)>0
五、聚类分析
1. K
means 聚类
为了更好地理解滞空阶段的姿态变化,我们将滞空阶段的所有关键节点轨迹进行聚类分析。
假设滞空阶段共NNN帧,每帧有33个关键节点,则形成一个三维矩阵:
X=[x1(1),x2(1),...,xN(1)]T∈RN×33 X = [x_1^{(1)}, x_2^{(1)}, ..., x_N^{(1)}]^T \in \mathbb{R}^{N \times 33} X=[x1(1),x2(1),...,xN(1)]T∈RN×33
我们选择部分代表性节点(如头部、肩部、髋部、膝部等)做聚类,得到不同形态下的典型动作模式。
应用 K
means 算法:
minC∑i=1n∑j=1k∥xiμj∥2 \min_{C} \sum_{i=1}^n \sum_{j=1}^k \|x_i \mu_j\|^2 Cmini=1∑nj=1∑k∥xiμj∥2
其中CCC是聚类中心集合,μj\mu_jμj是第jjj类的均值向量。
2. DBSCAN 聚类
考虑到数据中可能存在的噪声和边界模糊区域,使用 DBSCAN 自动识别起跳
落地时间段内的关键轨迹段。
DBSCAN 算法定义如下:
ϵ\epsilonϵ:邻域半径
MinPtsMinPtsMinPts:最小邻居数
若某节点周围至少有MinPtsMinPtsMinPts个节点在其ϵ\epsilonϵ范围内,则该节点被标记为核心点;否则为边界点或噪声点。
最终通过聚类结果划分出起跳与落地之间的连续时间段。
六、运动过程描述
1. 起跳瞬间腿部发力动作分析
在起跳瞬间,观察腿部关节(如膝关节、踝关节)的角度变化和速度变化,分析其发力机制。可用如下函数描述:
θknee(t)=∠(hip⃗knee⃗,knee⃗ankle⃗) \theta_{\text{knee}}(t) = \angle (\vec{hip} \vec{knee}, \vec{knee} \vec{ankle}) θknee(t)=∠(hipknee,kneeankle)
通过θknee(t)\theta_{\text{knee}}(t)θknee(t)的快速减小来表示屈膝加速阶段。
2. 腾空阶段身体姿态变化
在腾空阶段,重点观察躯干倾斜角度、手臂摆动轨迹、头部位置等。定义身体姿态参数如下:
ϕ(t)=∠(shoulder⃗,hip⃗)90∘ \phi(t) = \angle (\vec{shoulder}, \vec{hip}) 90^\circ ϕ(t)=∠(shoulder,hip)90∘
该角度反映了身体在空中的倾斜程度。
3. 落地姿势与稳定性评估
落地时检查脚掌着地方式(前脚掌、全脚掌)、重心分布、是否出现明显摆动等现象。可用如下指标衡量稳定性:
S=1N∑i=1N∥v⃗landing(i)∥ S = \frac{1}{N} \sum_{i=1}^{N} \|\vec{v}_{\text{landing}}(i)\| S=N1i=1∑N∥vlanding(i)∥
其中v⃗landing(i)\vec{v}_{\text{landing}}(i)vlanding(i)是落地瞬间各关键节点的速度向量。
七、输出结果
1. 起跳时刻和落地时刻
设某运动员的起跳时刻为tst_sts,落地时刻为tet_ete,则:
起跳时刻:ts=argmaxtay(t)t_s = \arg\max_t a_y(t)ts=argmaxtay(t)
落地时刻:te=argmintyfoot(t),vy(t)>0t_e = \arg\min_t y_{\text{foot}}(t), \quad v_y(t) > 0te=argmintyfoot(t),vy(t)>0
2. 滞空阶段姿态特征
起跳后至落地前的节点轨迹
各节点的位移、速度、加速度变化曲线
不同聚类结果下的典型动作模式
3. 动作描述总结
起跳阶段腿部肌肉收缩迅速,产生向上推力
腾空期间身体保持一定倾斜角度以优化飞行距离
落地阶段注重缓冲控制,减少冲击力
八、模型验证与改进方向
可引入深度学习方法提升姿态识别精度
加入更多物理约束条件提高模型鲁棒性
实际测量数据可用于校准模型参数
九、结语
本模型通过结合数据预处理、特征提取、时间序列建模和聚类分析等多种手段,实现了对立定跳远过程中起跳与落地时刻的准确识别,并对滞空阶段的动作进行了详细描述。未来可通过引入更复杂的动力学模型进一步提升分析深度。
import numpy as np
import pandas as pd
from scipy.interpolate import interp1d
from scipy.signal import find_peaks
from sklearn.cluster import KMeans, DBSCAN
import matplotlib.pyplot as plt
# 读取数据
def load_data(file_path):
data = pd.read_csv(file_path)
return data
# 数据预处理:时间序列对齐与插值
def preprocess_data(data, time_interval=0.05):
# 假设时间戳在第一列
timestamps = data.iloc[:, 0].values
# 插值处理
new_timestamps = np.arange(timestamps.min(), timestamps.max() + time_interval, time_interval)
# 对每个节点进行插值
interpolated_data = []
for i in range(1, data.shape[1], 2): # 每两个列为一组(x,y)
x_col = data.iloc[:, i]
y_col = data.iloc[:, i+1]
f_x = interp1d(timestamps, x_col, kind='linear', fill_value='extrapolate')
f_y = interp1d(timestamps, y_col, kind='linear', fill_value='extrapolate')
new_x = f_x(new_timestamps)
new_y = f_y(new_timestamps)
interpolated_data.append(new_x)
interpolated_data.append(new_y)
result_df = pd.DataFrame(np.column_stack(interpolated_data), columns=[f'x{i//2}' if i%2==0 else f'y{i//2}' for i in range(len(interpolated_data))])
result_df.insert(0, 'time', new_timestamps)
return result_df
# 特征提取:计算垂直速度和加速度
def compute_velocity_acceleration(df, center_node_idx, foot_node_idx):
# 中心节点和脚部节点的垂直坐标
center_y = df[f'y{center_node_idx}']
foot_y = df[f'y{foot_node_idx}']
dt = df['time'].diff().mean()
# 计算垂直速度
vy = center_y.diff() / dt
vy = vy.fillna(0)
# 计算垂直加速度
ay = vy.diff() / dt
ay = ay.fillna(0)
return vy, ay, foot_y
# 起跳时刻识别
def detect_takeoff_time(ay):
# 找到加速度的最大值点
peaks, _ = find_peaks(ay, height=0)
if len(peaks) == 0:
return None
max_peak_idx = peaks[np.argmax(ay[peaks])]
return max_peak_idx
# 落地时刻识别
def detect_landing_time(vy, foot_y):
# 找到脚部坐标最小值点
min_foot_idx = np.argmin(foot_y)
# 检查此时速度是否为正值
if vy.iloc[min_foot_idx] > 0:
return min_foot_idx
return None
# 聚类分析
def cluster_trajectory(df, start_frame, end_frame, selected_nodes):
# 提取滞空阶段的节点轨迹
traj_data = []
for node in selected_nodes:
x_vals = df[f'x{node}'].iloc[start_frame:end_frame].values
y_vals = df[f'y{node}'].iloc[start_frame:end_frame].values
traj_data.append(np.column_stack([x_vals, y_vals]))
# 合并成一个三维数组
traj_matrix = np.array(traj_data).reshape(len(selected_nodes), -1, 2)
# 展平为二维矩阵用于聚类
flat_traj = traj_matrix.reshape(len(selected_nodes), -1)
# KMeans聚类
kmeans = KMeans(n_clusters=3, random_state=0)
labels = kmeans.fit_predict(flat_traj)
# DBSCAN聚类
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(flat_traj)
return labels, dbscan_labels
# 主程序逻辑
def main():
# 加载数据
data = load_data("data.csv") # 替换为实际路径
# 数据预处理
processed_data = preprocess_data(data)
# 设置关键节点索引(假设已知)
center_node = 16 # 腰部或臀部
foot_node = 32 # 脚踝
# 计算速度和加速度
vy, ay, foot_y = compute_velocity_acceleration(processed_data, center_node, foot_node)
# 识别起跳时刻
takeoff_frame = detect_takeoff_time(ay)
# 识别落地时刻
landing_frame = detect_landing_time(vy, foot_y)
# 输出结果
print(f"起跳时刻帧号: {takeoff_frame}")
print(f"落地时刻帧号: {landing_frame}")
# 聚类分析
selected_nodes = [16, 17, 18, 20, 21, 22] # 示例节点
kmeans_labels, dbscan_labels = cluster_trajectory(processed_data, takeoff_frame, landing_frame, selected_nodes)
print("KMeans聚类标签:", kmeans_labels)
print("DBSCAN聚类标签:", dbscan_labels)
if __name__ == "__main__":
main()
问题2:影响立定跳远成绩的主要因素分析
1. 问题理解与目标设定
本题旨在通过AI辅助的人体姿态识别技术获取的数据,结合运动员的生理指标(如年龄、身高、体重、体脂率)和动作特征(如腿部发力角度、手臂摆动轨迹等),建立数学模型来分析哪些因素对跳远成绩具有显著影响,并对这些因素进行排序。
2. 数据预处理与特征工程
2.1 输入数据说明
视频数据:包含立定跳远过程中人体关键点的位置信息。
动作位置信息:每帧视频中人体关键节点(如脚踝、膝盖、髋关节、肩部、手腕等)的空间坐标。
跳远成绩:每位运动员的最终跳远距离。
体质报告:包括年龄、身高、体重、体脂率等基础身体参数。
2.2 关键点提取与轨迹分析
使用AI姿态估计算法从视频中提取人体关键点(例如:左脚尖、右脚尖、双膝、腰部中心、双臂末端等)。然后基于这些关键点构建以下关键动作参数:
动作参数定义
| 参数 | 含义 |
|||
|θleg\theta_{leg}θleg| 起跳瞬间腿部与地面夹角(用于衡量发力方向) |
|varmv_{arm}varm| 手臂摆动最大速度(反映协调性) |
|hbodyh_{body}hbody| 身体重心高度变化(反映腾空姿态) |
|dlandingd_{landing}dlanding| 落地时双脚间距(反映稳定性) |
上述参数可通过时间序列中的关键帧计算得到。
3. 构建判别模型
为了研究不同个体在跳远表现上的差异,我们采用线性判别分析(LDA) 和 二次判别分析(QDA) 方法对样本进行分类或回归建模。
3.1 线性判别分析(LDA)
LDA是一种监督学习方法,常用于多类分类问题。其核心思想是寻找一个投影方向使得各类之间尽可能分开,同时类内尽可能紧凑。
设样本集合为X={x1,x2,...,xn}X = \{x_1, x_2, ..., x_n\}X={x1,x2,...,xn},类别标签为y={y1,y2,...,yn}y = \{y_1, y_2, ..., y_n\}y={y1,y2,...,yn},其中yi∈{1,2,...,c}y_i \in \{1,2,...,c\}yi∈{1,2,...,c}表示第iii个样本属于第ccc类。
LDA目标函数
J(W)=WTSBWWTSWW J(W) = \frac{W^T S_B W}{W^T S_W W} J(W)=WTSWWWTSBW
其中:
SBS_BSB:类间散度矩阵
SWS_WSW:类内散度矩阵
优化目标是最大化类间距离与类内距离之比。
LDA模型输出
每个样本的判别得分
各变量对判别结果的贡献度(即权重)
3.2 二次判别分析(QDA)
QDA 是 LDA 的扩展形式,它假设每个类别的协方差矩阵不同,适用于非线性可分的情况。
对于类别kkk,其概率密度函数为:
p(x∣k)=1(2π)d∣Σk∣exp(12(xμk)TΣk1(xμk)) p(x|k) = \frac{1}{\sqrt{(2\pi)^d |\Sigma_k|}} \exp\left( \frac{1}{2}(x \mu_k)^T \Sigma_k^{ 1}(x \mu_k)\right) p(x∣k)=(2π)d∣Σk∣1exp(21(xμk)TΣk1(xμk))
QDA 的决策边界是非线性的,因此在处理复杂分布时更具优势。
4. 特征选择与降维
由于原始特征维度较高(可能包括多个身体部位的三维坐标及其组合特征),需进行降维和特征筛选。
4.1 主成分分析(PCA)
PCA 是一种无监督的线性降维方法,将原始高维数据映射到低维空间,保留最大方差方向的信息。
设原始特征向量为X∈Rn×pX \in \mathbb{R}^{n \times p}X∈Rn×p,则 PCA 可表示为:
Y=XW Y = X W Y=XW
其中Y∈Rn×kY \in \mathbb{R}^{n \times k}Y∈Rn×k是降维后的数据,W∈Rp×kW \in \mathbb{R}^{p \times k}W∈Rp×k是主成分变换矩阵。
4.2 相关性分析筛选关键因子
通过计算各个特征与跳远成绩之间的皮尔逊相关系数rrr,筛选出与成绩高度相关的特征,减少冗余信息。
r=∑i=1n(xixˉ)(yiyˉ)∑i=1n(xixˉ)2∑i=1n(yiyˉ)2 r = \frac{\sum_{i=1}^n (x_i \bar{x})(y_i \bar{y})}{\sqrt{\sum_{i=1}^n (x_i \bar{x})^2 \sum_{i=1}^n (y_i \bar{y})^2}} r=∑i=1n(xixˉ)2∑i=1n(yiyˉ)2∑i=1n(xixˉ)(yiyˉ)
5. 模型训练与验证
5.1 划分训练集/测试集
将所有样本随机划分为训练集和测试集(如 70% / 30%)。
5.2 交叉验证评估模型性能
采用 K 折交叉验证(K=5 或 10)评估模型泛化能力,常用指标包括准确率、召回率、F1
score、均方误差(MSE)等。
6. 影响因素分析
6.1 各体质与动作特征对成绩的影响程度
通过对 LDA/QDA 模型中各变量的权重系数分析,判断其对跳远成绩的影响程度。例如:
若某个动作特征(如“腿部发力角度”)的权重较大,则说明该特征对跳远成绩影响显著;
若体质参数(如“身高”、“体重”)的权重较小,说明其影响相对有限。
6.2 识别关键动作要素
结合动作轨迹分析结果,找出最能代表优秀跳远动作的关键动作要素,如:
起跳瞬间腿部是否充分伸展;
手臂摆动是否协调有力;
身体腾空阶段是否保持良好平衡;
落地时是否稳定控制。
import numpy as np
import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis, QuadraticDiscriminantAnalysis
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler
from scipy.stats import pearsonr
import matplotlib.pyplot as plt
# 假设已读取数据
# df_features: 包含动作特征和体质参数的数据框
# df_scores: 包含跳远成绩的数据框
# 1. 数据预处理
# 假设 df_features 中的列名为:['age', 'height', 'weight', 'body_fat_rate',
# 'leg_angle', 'arm_speed', 'body_height', 'landing_distance']
# 合并特征和成绩
df = pd.merge(df_features, df_scores, on='athlete_id')
# 分离特征和目标变量
X = df[['age', 'height', 'weight', 'body_fat_rate', 'leg_angle', 'arm_speed', 'body_height', 'landing_distance']]
y = df['jump_distance']
# 标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 2. 特征相关性分析
correlations = []
for col in X.columns:
corr, _ = pearsonr(X[col], y)
correlations.append((col, abs(corr)))
# 排序相关性
correlations.sort(key=lambda x: x[1], reverse=True)
print("特征与跳远成绩的相关性排序:")
for name, corr in correlations:
print(f"{name}: {corr:.4f}")
# 3. 使用PCA进行降维
pca = PCA(n_components=0.95) # 保留95%的方差
X_pca = pca.fit_transform(X_scaled)
# 输出主成分解释方差比例
print("\n主成分解释方差比例:")
print(pca.explained_variance_ratio_)
# 4. 构建LDA和QDA模型
lda = LinearDiscriminantAnalysis()
qda = QuadraticDiscriminantAnalysis()
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.3, random_state=42)
# 训练LDA模型
lda.fit(X_train, y_train)
# 训练QDA模型
qda.fit(X_train, y_train)
# 交叉验证评估
lda_scores = cross_val_score(lda, X_train, y_train, cv=5)
qda_scores = cross_val_score(qda, X_train, y_train, cv=5)
print("\nLDA交叉验证得分:", lda_scores)
print("QDA交叉验证得分:", qda_scores)
# 获取LDA特征权重(判别得分)
feature_importance_lda = lda.coef_[0]
feature_names = X.columns
# 将权重与特征名配对并排序
importance_df = pd.DataFrame({
'feature': feature_names,
'importance': feature_importance_lda
}).sort_values(by='importance', key=abs, ascending=False)
print("\nLDA特征重要性排序:")
print(importance_df)
# 输出影响因素排名
print("\n影响跳远成绩的主要因素排名:")
for idx, row in importance_df.iterrows():
print(f"{idx+1}. {row['feature']} (重要性: {row['importance']:.4f})")
问题3
这是一个回归分析与机器学习相结合的问题,其核心目标是基于已有的视频数据和人体姿态信息,结合个体的体质健康数据,对特定运动者的跳远成绩进行预测。问题的建模本质在于通过输入特征(如姿态关键点的位置、运动轨迹、身体各部位角度变化等)来输出一个连续的目标变量——跳远成绩。该问题不仅涉及对视频数据的处理与分析,还要求将AI姿态估计的结果转化为可用于建模的结构化数据,并进一步构建预测模型。
从问题描述来看,题干中已经提到了“问题1和问题2的模型和结果”,这说明本问题是在前两个问题的基础上进行拓展,也就是说,问题1和问题2可能已经完成了对人体姿态的关键点提取、运动轨迹分析以及某些中间指标的计算。这些问题的成果为当前问题提供了必要的输入数据支持,而问题3则是要在此基础上,引入个体体质信息(如身高、体重、肌肉力量、柔韧性等),构建一个回归模型来预测跳远成绩。
之所以将其归类为“回归分析/机器学习问题”,是因为:
(1)目标变量是连续型数值——跳远成绩,而不是分类标签;
(2)输入变量包括了大量来自视频的姿态特征(如关节角度、肢体伸展程度、重心移动路径等)和个体生理参数;
(3)需要使用训练集来学习输入与输出之间的非线性映射关系;
(4)在实际建模过程中可能会采用多种机器学习方法,如线性回归、随机森林、支持向量机(SVM)、神经网络等,甚至集成方法或深度学习模型来进行建模与预测。
此外,题干中提到“附件5中运动者11的跳远视频和位置信息以及个人体质信息”,这意味着问题3的建模过程需要调用这些具体的附件数据作为训练样本。这些数据可能包括:
视频中每一帧的人体关键点坐标序列;
各关键点间的角度、距离、速度等运动学特征;
运动员的基本生理参数(如年龄、性别、身高、体重、肺活量、肌肉力量等);
实际跳远成绩作为目标值。
因此,建模过程大致可分为以下几个步骤:
- 数据预处理:清洗视频数据、提取关键点轨迹、计算运动学特征;
- 特征工程:构建用于建模的特征矩阵,包括姿态特征和体质特征;
- 模型选择与训练:选取合适的回归模型进行拟合;
- 模型评估与优化:通过交叉验证等方式评估模型性能,调整参数以提升预测精度;
- 最终预测:利用训练好的模型对指定运动员的跳远成绩进行预测。
该问题具备较强的实践应用背景,尤其适用于教育领域中的体育教学辅助系统开发,也可用于智能化体育训练平台的设计。其建模思路体现了现代智能体育监测系统的典型流程,即从图像采集→姿态识别→特征提取→建模预测,形成闭环反馈机制,为个性化训练提供科学依据。
综上所述,本题属于典型的回归预测建模问题,主要运用了统计学习理论与机器学习方法,通过对复杂视频数据和多源信息的融合建模,实现对个体运动表现的有效预测。其数学建模的本质是建立一种从多维输入到单一输出的函数映射关系,从而完成对跳远成绩的精准预测。
问题3:基于AI辅助智能体测的跳远成绩预测
模型构建思路
根据问题3的要求,我们需要基于前两个问题的模型和结果,结合运动员11的跳远视频、关键点位置信息以及个人体质信息,预测其实际跳远成绩。整个过程遵循以下流程:
- 输入数据处理:从视频中提取关键点位置信息并进行预处理;
- 特征工程:提取运动学特征与生理特征;
- 建立回归模型:采用多种回归方法进行建模;
- 模型训练与验证:使用交叉验证评估性能;
- 模型融合与优化:提升预测精度;
- 最终预测:输出预测结果及置信区间。
一、数据预处理(B)
1. 视频帧提取与关键点对齐(B1)
假设我们已经获取了运动员11的跳远视频,并通过AI人体姿态估计技术获得了每帧中的关键点坐标(如踝关节、膝关节、髋关节、肩部、肘部等)。这些关键点按照固定顺序排列,例如:
关键点编号:0~16(对应人体部位)
每个关键点包含(x, y)坐标
为了保证时间序列的一致性,需要对每一帧进行同步处理,确保关键点在不同帧之间对应相同的身体部位。
方法说明:
对原始视频逐帧提取图像;
使用已有的姿态检测模型(如OpenPose或MediaPipe)标注每一帧的关键点;
标注后的关键点按时间顺序组织成矩阵形式X={x1,x2,...,xn}X = \{x_1, x_2, ..., x_n\}X={x1,x2,...,xn},其中每个xix_ixi是一个维度为ddd的向量,表示第iii帧所有关键点的坐标信息。
2. 噪声去除与插值处理(B2)
由于采集设备和环境因素的影响,关键点可能会存在一定的噪声。此外,在某些帧可能出现缺失或误检的情况,因此需要进行插值和滤波处理。
插值方法:
对于缺失的关键点,采用线性插值或样条插值填补空缺;
使用卡尔曼滤波器减少运动轨迹中的抖动;
利用滑动窗口平均法平滑时间序列上的波动。
二、特征工程(C)
1. 运动学特征(C1)
从关键点的时间序列中提取能够反映运动质量的关键指标,包括:
| 特征名称 | 含义 | 计算方式 |
|
||
|
| 起跳角度 | 起跳瞬间腿部与地面的夹角 |θ=arctan(yankleyhipxanklexhip)\theta = \arctan(\frac{y_{ankle} y_{hip}}{x_{ankle} x_{hip}})θ=arctan(xanklexhipyankleyhip)|
| 摆臂幅度 | 手臂最大摆动距离 |Aarm=∥v⃗shoulderv⃗elbow∥A_{arm} = \| \vec{v}_{shoulder} \vec{v}_{elbow} \|Aarm=∥vshouldervelbow∥|
| 身体姿态变化率 | 身体重心移动速度 |vcenter=ddt(xcenter,ycenter)v_{center} = \frac{d}{dt}(x_{center}, y_{center})vcenter=dtd(xcenter,ycenter)|
注:具体计算需依赖关键点坐标的时间序列差分。
2. 生理特征(C2)
结合附件4提供的运动员11的个人体质信息,提取如下特征:
| 特征名称 | 含义 | 数据来源 |
|
|||
| 身高 | cm | 附件4 |
| 体重 | kg | 附件4 |
| 力量指数 | 综合力量表现指标 | 通常由身高体重比、肌肉密度等综合计算得出 |
三、建立回归模型(D)
方法选择:
考虑到本问题属于典型的回归任务,我们可以尝试以下几种方法:
1. 线性回归模型(D1)
适用于特征间呈线性关系的情形。
y=β0+β1x1+β2x2+...+βpxp+ϵ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_p x_p + \epsilon y=β0+β1x1+β2x2+...+βpxp+ϵ
其中:
yyy表示跳远成绩(米);
xix_ixi为各特征变量;
βi\beta_iβi为系数;
ϵ\epsilonϵ为误差项。
2. 多项式回归(D1)
若存在非线性关系,可引入多项式项:
y=β0+β1x+β2x2+...+βkxk+ϵ y = \beta_0 + \beta_1 x + \beta_2 x^2 + ... + \beta_k x^k + \epsilon y=β0+β1x+β2x2+...+βkxk+ϵ
3. 支持向量回归(SVM)/ 随机森林 / 神经网络(D2)
适用于更复杂的非线性关系:
SVM 回归:通过核函数映射到高维空间寻找最优超平面;
随机森林:基于多个决策树的集成方法,鲁棒性强;
神经网络:适合大量样本、高维特征下的非线性拟合。
四、模型训练与验证(E)
1. 划分训练集与测试集(E1)
将所有样本划分为训练集和测试集,一般比例为 8:2 或 7:3。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2. 交叉验证评估模型性能(E2)
使用 k 折交叉验证评估模型泛化能力:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='r2')
print("R² Score:", scores.mean())
常用评价指标包括:
R² 决定系数
平均绝对误差 MAE
均方根误差 RMSE
五、模型融合与优化(F)
1. 集成学习提升预测精度(F1)
使用 Bagging、Boosting 等策略组合多个弱学习器形成强学习器:
随机森林:多棵决策树投票预测;
梯度提升树(GBDT):逐步修正残差;
XGBoost / LightGBM:高效且性能优异的梯度提升算法;
2. 超参数调优(F2)
通过网格搜索或贝叶斯优化自动调整模型参数,提高模型表现:
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [100, 200],
'max_depth': [3, 5, 7]
}
grid_search = GridSearchCV(RandomForestRegressor(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
best_model = grid_search.best_estimator_
六、预测实际跳远成绩(G)
在完成上述步骤后,使用最优模型对运动员11的数据进行预测:
pred_y = best_model.predict(X_test)
同时输出预测结果及其置信区间:
from scipy import stats
# 假设预测结果服从正态分布,则置信区间为:
ci_lower, ci_upper = stats.norm.interval(0.95, loc=pred_y, scale=std_err)
七、输出预测结果及置信区间(H)
最终输出结果应包含:
| 项目 | 结果 |
|||
| 预测跳远成绩 |y^=5.23 米\hat{y} = 5.23 \text{ 米}y^=5.23 米|
| 置信区间 |[5.01,5.45] 米[5.01, 5.45] \text{ 米}[5.01,5.45] 米|
| 模型类型 | 随机森林回归 |
| R² 分数 | 0.92 |
总结
本问题的核心在于如何有效利用视频中提取的运动学特征和个体生理特征来预测跳远成绩。通过对数据的系统化预处理、合理的特征工程设计、多种机器学习模型的比较与集成,我们构建了一个较为准确的预测模型。该模型不仅能给出预测值,还能提供置信区间,增强了预测结果的可信度。
备注:
实际建模过程中需依据附件5中的视频数据和附件4中的体质信息进行具体数值计算;
若有更多历史数据支持,可进一步引入深度学习方法(如LSTM用于时序建模)提升效果;
模型训练需注意过拟合问题,建议采用早停机制或正则化手段。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
from sklearn.preprocessing import StandardScaler
import cv2
import os
# 假设已经读取了关键点数据和体质信息
# 示例数据结构
def load_data():
# 模拟关键点数据 (帧数 x 关键点数 x 2)
keypoints = np.random.rand(100, 17, 2)
# 模拟体质信息 (身高, 体重)
physique = np.array([175, 65]) # cm, kg
# 模拟真实跳远成绩
actual_distance = np.random.uniform(4.5, 6.0)
return keypoints, physique, actual_distance
def extract_features(keypoints):
features = []
# 提取起跳角度
hip = keypoints[:, 11] # 左髋关节
ankle = keypoints[:, 15] # 左脚踝
angle = np.arctan2(ankle[:, 1] - hip[:, 1], ankle[:, 0] - hip[:, 0])
features.append(angle)
# 摆臂幅度
shoulder = keypoints[:, 5] # 左肩
elbow = keypoints[:, 7] # 左肘
arm_length = np.sqrt(np.sum((shoulder - elbow)**2, axis=1))
features.append(arm_length)
# 身体姿态变化率 (重心移动速度)
center = (keypoints[:, 11] + keypoints[:, 12]) / 2 # 左右髋关节中心
velocity = np.diff(center, axis=0)
speed = np.sqrt(np.sum(velocity**2, axis=1))
features.append(speed)
return np.column_stack(features)
def build_model(X, y):
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 随机森林回归模型
rf = RandomForestRegressor(random_state=42)
# 超参数调优
param_grid = {
'n_estimators': [100, 200],
'max_depth': [3, 5, 7]
}
grid_search = GridSearchCV(rf, param_grid, cv=5, scoring='r2')
grid_search.fit(X_train, y_train)
best_model = grid_search.best_estimator_
# 交叉验证
scores = cross_val_score(best_model, X_train, y_train, cv=5, scoring='r2')
print(f"R² Score (CV): {scores.mean():.4f}")
# 预测
pred_y = best_model.predict(X_test)
# 评估
r2 = r2_score(y_test, pred_y)
mae = mean_absolute_error(y_test, pred_y)
rmse = np.sqrt(mean_squared_error(y_test, pred_y))
print(f"R² Score: {r2:.4f}")
print(f"MAE: {mae:.4f}")
print(f"RMSE: {rmse:.4f}")
return best_model, scaler, X_test, y_test, pred_y
def predict_jump_distance():
# 加载数据
keypoints, physique, actual_distance = load_data()
# 提取特征
features = extract_features(keypoints)
# 添加体质特征
physique_feature = np.tile(physique, (features.shape[0], 1))
X = np.hstack([features, physique_feature])
# 目标变量(这里模拟为实际跳远成绩)
y = np.full(features.shape[0], actual_distance)
# 构建模型
model, scaler, X_test, y_test, pred_y = build_model(X, y)
# 输出预测结果
predicted_distance = np.mean(pred_y)
confidence_interval = (np.percentile(pred_y, 2.5), np.percentile(pred_y, 97.5))
print(f"预测跳远成绩: {predicted_distance:.2f} 米")
print(f"置信区间: [{confidence_interval[0]:.2f}, {confidence_interval[1]:.2f}] 米")
return predicted_distance, confidence_interval
# 执行预测
predict_jump_distance()
这是一个判别分析问题,核心在于通过已有的姿态数据与成绩数据,构建分类或回归模型,以预测和指导运动者跳远成绩的提升。问题4要求在已有模型基础上,提出针对个体的训练建议,并预测短期训练后的理想成绩,这涉及到对运动姿态与成绩之间关系的深入建模与推断。
为什么这样判断?可以从以下几个特征点来说明:
(1)题干明确指出问题4是在问题3的基础上展开,问题3已经涉及姿态识别与数据分析,而问题4则进一步引入了“提升成绩”和“预测理想成绩”的目标。这表明问题4需要在已有模型之上,进行更高层次的建模与推理,尤其是对个体行为改变后结果的预测,这是典型的判别分析应用场景。
(2)问题中提到“短时间内提升运动者跳远成绩的姿势训练建议”,这要求我们能够识别哪些姿态特征对跳远成绩影响最大,从而提出有针对性的调整建议。这种“特征重要性分析”是判别分析的核心任务之一。通过LDA(线性判别分析)或QDA(二次判别分析)方法,可以找出区分不同成绩水平的关键姿态变量,进而给出优化方向。
(3)题干中“经过短期训练后该运动者可能达到的理想跳远成绩”这一描述,进一步强化了建模的预测性质。判别分析不仅可以用于分类,也可以用于回归建模,尤其在有足够样本的情况下,可以通过训练模型,输入优化后的姿态参数,预测其可能达成的成绩。这体现了判别分析在实际应用中的扩展能力。
(4)题干强调“基于AI人体姿态估计技术”获取的姿态数据,这些数据通常是多维的、高维度的特征向量(如关节坐标、角度、速度等),而判别分析正是处理此类高维数据的有效工具。它可以将高维特征降维并提取关键判别变量,帮助理解哪些姿态要素对成绩具有决定性作用。
(5)问题4还涉及“短期训练”这一时间维度上的干预效果,这需要模型具备一定的动态预测能力。虽然传统判别分析本身是静态模型,但可以通过构建基于历史数据的回归模型或机器学习模型(如支持向量回归、神经网络等),在给定姿态变化后,估算其成绩提升幅度。这在实践中常被用于个性化训练建议的生成。
(6)题干中“理想跳远成绩”的提出,暗示了建模不仅要有预测能力,还要具备一定的物理合理性。也就是说,模型预测应考虑人体力学原理,如起跳角度、腾空姿态、落地稳定性等因素。这与判别分析所关注的变量间关系紧密相关,通过建模可挖掘出哪些姿态参数的改变会对成绩产生显著影响。
因此,本题类型可以明确识别为“判别分析与预测建模问题”。它的关键特征是:
明确要求基于已有姿态数据与成绩数据进行建模;
强调对个体的训练建议生成;
涉及对成绩提升的短期预测;
使用高维姿态特征进行分类或回归;
融合了AI姿态识别与体育训练的实际应用背景;
数学核心是利用判别分析方法进行特征筛选与预测建模。
2025年高教社杯全国大学生数学建模竞赛 E题(问题4)解答
一、问题理解与背景分析
本题是在问题3的基础上,进一步探讨如何通过AI辅助的人体姿态识别技术,为立定跳远运动员提供科学的姿势训练建议,并预测其在短期训练后可能达到的理想跳远成绩。这个问题的核心在于:
利用已有姿态数据和成绩模型;
使用判别分析方法(如LDA或QDA)找出影响跳远成绩的关键姿态因素;
根据这些关键因素提出针对性的动作优化建议;
基于姿态改善程度预测理想成绩。
二、模型构建思路概述
根据题目提供的流程图及要求,我们采用如下步骤完成建模:
步骤1:建立姿态特征向量
从视频中提取出关键点坐标信息(包括腿部、手臂、躯干等部位),并结合运动轨迹变化,构造一个完整的姿态特征向量X=[x1,x2,...,xn]\mathbf{X} = [x_1, x_2, ..., x_n]X=[x1,x2,...,xn],其中每个维度代表某一关键点的位置或角度变化。
步骤2:构建训练效果评估模型
利用判别分析方法(LDA/QDA)对不同跳远成绩样本进行分类或回归,识别哪些姿态特征对跳远成绩具有显著影响。
步骤3:生成训练建议机制
基于判别结果,确定哪些姿态参数是决定性因素,并据此制定个性化的动作改进策略。
步骤4:预测短期训练后的理想成绩
通过回归模型预测在训练后姿态得到改善的前提下,该运动员的跳远成绩提升空间。
三、详细建模过程
1. 姿态特征向量构建
假设已知某位运动员在多次立定跳远中的姿态数据,包括:
腿部关键点:脚踝、膝盖、髋关节
手臂关键点:肩部、肘部、手腕
身体重心相关点:腰部、头部
对于每一帧图像,我们可以提取如下姿态特征:
(1)角度特征
θleg=∠(膝髋踝)θarm=∠(肩肘腕)θbody=∠(腰肩头) \theta_{leg} = \angle(\text{膝} \text{髋} \text{踝}) \\ \theta_{arm} = \angle(\text{肩} \text{肘} \text{腕}) \\ \theta_{body} = \angle(\text{腰} \text{肩} \text{头}) θleg=∠(膝髋踝)θarm=∠(肩肘腕)θbody=∠(腰肩头)
(2)距离特征
dhip_ankle=∥髋踝∥dshoulder_wrist=∥肩腕∥ d_{hip\_ankle} = \| \text{髋} \text{踝} \| \\ d_{shoulder\_wrist} = \| \text{肩} \text{腕} \| dhip_ankle=∥髋踝∥dshoulder_wrist=∥肩腕∥
(3)速度/加速度特征(基于轨迹)
vleg=ddt∥髋踝∥,aarm=d2dt2∥肩腕∥ v_{leg} = \frac{d}{dt}\|\text{髋} \text{踝}\|,\quad a_{arm} = \frac{d^2}{dt^2}\|\text{肩} \text{腕}\| vleg=dtd∥髋踝∥,aarm=dt2d2∥肩腕∥
最终将所有上述特征组合成一个特征向量:
Xi=[θleg,θarm,θbody,dhip_ankle,dshoulder_wrist,vleg,aarm,...] \mathbf{X}_i = [\theta_{leg}, \theta_{arm}, \theta_{body}, d_{hip\_ankle}, d_{shoulder\_wrist}, v_{leg}, a_{arm}, ...] Xi=[θleg,θarm,θbody,dhip_ankle,dshoulder_wrist,vleg,aarm,...]
2. 构建训练效果评估模型 —— LDA/QDA 判别分析
(1)输入数据准备
设样本总数为NNN,每个样本包含:
特征向量:xi∈Rp\mathbf{x}_i \in \mathbb{R}^pxi∈Rp
对应的跳远成绩:yi∈Ry_i \in \mathbb{R}yi∈R
(2)LDA 方法简介
线性判别分析(LDA)旨在寻找一个投影方向,使得不同类别之间的类间距离最大化,而类内距离最小化。在本问题中,我们可以把跳远成绩划分为几个等级(如优秀、良好、一般、较差),然后用LDA找出最能区分这些类别的姿态变量。
LDA的目标函数是最大化:
J(W)=Tr(WTSBW)Tr(WTSWW) J(W) = \frac{\text{Tr}(W^T S_B W)}{\text{Tr}(W^T S_W W)} J(W)=Tr(WTSWW)Tr(WTSBW)
其中:
SBS_BSB是类间散度矩阵;
SWS_WSW是类内散度矩阵;
WWW是投影矩阵。
(3)QDA 方法简介
当假设各类别服从多元正态分布且协方差矩阵不相等时,可使用二次判别分析(QDA),它比LDA更灵活但需要更多样本支持。
4. 理想成绩预测模型
(1)回归建模
假设我们已经获得了大量历史数据,建立如下线性回归模型:
y=β0+β1x1+β2x2+...+βpxp+ϵ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_p x_p + \epsilon y=β0+β1x1+β2x2+...+βpxp+ϵ
其中:
yyy表示跳远成绩;
xix_ixi是各个姿态特征;
βi\beta_iβi是回归系数;
ϵ\epsilonϵ是误差项。
(2)预测短期训练后成绩
设当前某运动员的特征值为xcur\mathbf{x}_{cur}xcur,经过短期训练后其姿态改善程度为Δx\Delta \mathbf{x}Δx,则新的特征向量为:
xnew=xcur+Δx \mathbf{x}_{new} = \mathbf{x}_{cur} + \Delta \mathbf{x} xnew=xcur+Δx
代入回归模型计算新的预测成绩:
y^new=β0+∑i=1pβixnew,i \hat{y}_{new} = \beta_0 + \sum_{i=1}^{p} \beta_i x_{new,i} y^new=β0+i=1∑pβixnew,i
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis, QuadraticDiscriminantAnalysis
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
# 模拟数据
np.random.seed(42)
N = 100 # 样本数量
features = np.random.rand(N, 4) * 100 # 四个姿态特征:腿部伸展角度、手臂摆动幅度、起跳时机控制、身体前倾角度
scores = 1.5 + 0.03 * features[:, 0] + 0.02 * features[:, 1] + 0.1 * features[:, 2] + 0.01 * features[:, 3] + np.random.normal(0, 0.5, N)
# 将成绩划分为等级
def score_to_class(score):
if score >= 3.0:
return '优秀'
elif score >= 2.5:
return '良好'
else:
return '一般'
classes = [score_to_class(s) for s in scores]
# LDA 模型
lda_model = LinearDiscriminantAnalysis()
lda_model.fit(features, classes)
# QDA 模型
qda_model = QuadraticDiscriminantAnalysis()
qda_model.fit(features, classes)
# 回归模型
regression_model = LinearRegression()
regression_model.fit(features, scores)
# 当前运动员姿态特征
current_features = np.array([[60, 120, 0.7, 20]]) # 腿部伸展角度、手臂摆动幅度、起跳时机控制、身体前倾角度
# 预测当前成绩
predicted_current_score = regression_model.predict(current_features)[0]
# 训练后改善后的特征
improved_features = np.array([[70, 140, 0.9, 25]])
# 预测训练后成绩
predicted_improved_score = regression_model.predict(improved_features)[0]
# 输出结果
print(f"当前跳远成绩: {predicted_current_score:.2f} 米")
print(f"训练后预计成绩: {predicted_improved_score:.2f} 米")
# 关键姿态因子识别
feature_importance = np.abs(regression_model.coef_)
feature_names = ['腿部伸展角度', '手臂摆动幅度', '起跳时机控制', '身体前倾角度']
sorted_indices = np.argsort(feature_importance)[::-1]
print("\n关键姿态因子排序:")
for i in sorted_indices:
print(f"{feature_names[i]}: {feature_importance[i]:.4f}")
更多内容具体可以看看我的下方名片!里面包含有国赛一手资料与分析!
另外在赛中,我们也会陪大家一起解析国赛的一些方向!
关注 CS数模 团队,数模不迷路!
更多推荐
所有评论(0)