如何对比两人运动数据时间序列图表并评估动作复制相似度
运动数据对比:自动绘图与相似度评估
一、自动生成每列独立时间序列图
用matplotlib循环遍历两个DataFrame的每一列,为每个身体部位的坐标生成独立对比图表:
import pandas as pd import matplotlib.pyplot as plt # 读取并预处理数据 fp = pd.read_csv("first_person.csv") sp = pd.read_csv("second_person.csv") fp = fp.iloc[:, 1:] sp = sp.iloc[:, 1:] # 遍历所有身体部位列 for col in fp.columns: # 创建独立画布 plt.figure(figsize=(10, 6)) # 绘制两人的时间序列曲线 plt.plot(fp[col], label='人员1', color='blue') plt.plot(sp[col], label='人员2', color='orange', linestyle='--') # 设置图表属性 plt.title(f'{col} 动作序列对比') plt.xlabel('时间步') plt.ylabel('坐标值') plt.legend() plt.grid(True) # 可选:将图表保存到本地 # plt.savefig(f'{col}_comparison.png') plt.show() # 关闭画布释放内存 plt.close()
这段代码会为每个身体部位(如LEFT_SHOULDER_Y)生成单独的对比图,避免图表重叠,方便逐个查看动作细节差异。
二、动作复制相似度评估方法
1. 皮尔逊相关系数
衡量两个时间序列的线性相关程度,取值范围[-1,1],越接近1说明线性相似度越高:
# 计算每列的皮尔逊相关系数 corr_results = pd.DataFrame({ '身体部位': fp.columns, '相关系数': [fp[col].corr(sp[col]) for col in fp.columns] }) print(corr_results)
2. 动态时间规整(DTW)
适合处理动作快慢不一致的时间序列,通过最优匹配计算序列距离,距离越小相似度越高:
先安装依赖:pip install fastdtw
from fastdtw import fastdtw from scipy.spatial.distance import euclidean # 计算每列的DTW距离 dtw_results = [] for col in fp.columns: distance, _ = fastdtw(fp[col].values, sp[col].values, dist=euclidean) dtw_results.append({'身体部位': col, 'DTW距离': distance}) dtw_df = pd.DataFrame(dtw_results) print(dtw_df)
3. 均方误差(MSE)
衡量两个序列的数值差异,值越小说明动作复制越精准:
mse_results = pd.DataFrame({ '身体部位': fp.columns, '均方误差': [(fp[col] - sp[col])**2.mean() for col in fp.columns] }) print(mse_results)
4. 余弦相似度
从向量角度衡量序列相似性,取值范围[-1,1],越接近1相似度越高:
from sklearn.metrics.pairwise import cosine_similarity cosine_results = [] for col in fp.columns: fp_vec = fp[col].values.reshape(1, -1) sp_vec = sp[col].values.reshape(1, -1) sim = cosine_similarity(fp_vec, sp_vec)[0][0] cosine_results.append({'身体部位': col, '余弦相似度': sim}) cosine_df = pd.DataFrame(cosine_results) print(cosine_df)
可以结合多种指标综合评估,比如对每个部位的相似度打分后取平均,得到整体动作复制的相似度水平。
内容的提问来源于stack exchange,提问作者pavan
相关产品推荐
相关产品推荐

