如何计算两组人体部位运动数据集的相关系数?
计算两组人体部位运动坐标数据集的相关系数方案
只对比x坐标的方法无效,核心原因是人体部位的运动是二维(x,y)的,单独某一轴的相关性无法反映整体运动的关联程度。以下是几种可行的计算方法、工具和实现方式:
一、Excel手动计算(适合中小规模数据)
1. 基于相对位移的相关性分析
先消除初始位置差异,聚焦运动变化的关联:
- 新增4列计算相对位移:
Ax_rel=Ax- 第一帧Ax值Ay_rel=Ay- 第一帧Ay值Bx_rel=Bx- 第一帧Bx值By_rel=By- 第一帧By值
- 计算x、y轴位移的皮尔逊相关系数:
- 用
CORREL(Ax_rel列, Bx_rel列)得到x方向运动的相关度 - 用
CORREL(Ay_rel列, By_rel列)得到y方向运动的相关度 - 若两个系数都较高,说明两组部位的运动整体关联紧密
- 用
2. 方向余弦相似度(衡量运动方向一致性)
逐帧计算两组位移向量的夹角余弦值,再求平均值:
- 新增列输入公式:
= (Ax_rel*Bx_rel + Ay_rel*By_rel) / (SQRT(Ax_rel^2 + Ay_rel^2) * SQRT(Bx_rel^2 + By_rel^2)) - 用
AVERAGE()函数对该列求平均,结果越接近1,说明两组部位的运动方向越一致
3. 复相关系数(整体二维相关性)
启用Excel的「分析工具库」后,通过协方差矩阵计算:
- 依次点击「文件→选项→加载项」,勾选「分析工具库」并启用
- 点击「数据→数据分析→协方差」,选择Ax_rel、Ay_rel、Bx_rel、By_rel的列范围,生成协方差矩阵
- 代入公式计算复相关系数:
注:C1是Ax_rel与Bx_rel的协方差,D2是Ay_rel与By_rel的协方差,C2是Ax_rel与By_rel的协方差,D1是Ay_rel与Bx_rel的协方差;E1是A组位移的联合方差,E2是B组位移的联合方差=SQRT((C1^2 + D2^2 + 2*C2*D1)/(E1*E2))
二、Python脚本实现(适合大规模帧数据)
如果数据量较大,用Python的pandas和numpy可以快速批量计算:
import pandas as pd import numpy as np # 读取Excel数据 df = pd.read_excel('your_data_file.xlsx') # 计算相对位移(消除初始位置影响) df['Ax_rel'] = df['Ax'] - df['Ax'].iloc[0] df['Ay_rel'] = df['Ay'] - df['Ay'].iloc[0] df['Bx_rel'] = df['Bx'] - df['Bx'].iloc[0] df['By_rel'] = df['By'] - df['By'].iloc[0] # 计算x、y轴位移的皮尔逊相关系数 corr_x = np.corrcoef(df['Ax_rel'], df['Bx_rel'])[0, 1] corr_y = np.corrcoef(df['Ay_rel'], df['By_rel'])[0, 1] # 计算平均方向余弦相似度 df['cosine_similarity'] = (df['Ax_rel'] * df['Bx_rel'] + df['Ay_rel'] * df['By_rel']) / \ (np.sqrt(df['Ax_rel']**2 + df['Ay_rel']**2) * np.sqrt(df['Bx_rel']**2 + df['By_rel']**2)) avg_cosine = df['cosine_similarity'].mean() # 输出结果 print(f"X方向位移相关系数: {corr_x:.4f}") print(f"Y方向位移相关系数: {corr_y:.4f}") print(f"平均运动方向相似度: {avg_cosine:.4f}")
三、进阶:轨迹整体相似性分析
如果需要分析完整运动轨迹的关联,可以用:
- 动态时间规整(DTW):衡量两个时间序列(轨迹)的相似程度,值越小说明轨迹越相似,Python中可通过
dtw库实现 - 主成分分析(PCA):将二维(x,y)数据降维为一维主成分,再计算两组主成分序列的皮尔逊相关系数
内容的提问来源于stack exchange,提问作者Collin Bergmann
相关产品推荐
相关产品推荐

