问题描述:
由加速度传感器和陀螺仪采集的数据保存格式为N行7列的txt文件,前三列分别为xyz轴的加速度,后四列分别为四元数。采样时间间隔相等。
采集的数据为高手运球(high)30个、低手(low)30个、双手交替运球(cross)30个、直线运球(line)20个、体前双手交替运球(front)20个,原地快速(fast)运球200个左右。
数据预处理:
1、根据加速度和四元数,可以求出当前时刻对应的总价速度、xyz轴的重力分量、手臂和水平面的夹角角度(如下图)
2、寻峰算法找到各个动作的峰值,标上红点,寻找谷值标上绿点
寻找谷值的逻辑比较简单,所以容易出现连续多个谷值的情况,所以加上一句:
加这句之前:
谷值点位于
[30, 81, 141, 188, 256, 295, 365, 410, 472, 518, 580, 626, 694, 736, 796, 849, 904, 961, 1013, 1056, 1115, 1164, 1219, 1262, 1323, 1372, 1423, 1477]
加之后:
[30, 116, 230, 339, 449, 559, 672, 777, 877, 991, 1093, 1195, 1296, 1401]
不知道为什么,波峰波谷的时间点挤到一起了
这个判断‘谷必须在峰后面’的if判断句不应该放在findpeaks里,不然就会一直等待peak出现才能更新谷值。
if句放在DetectorPeaks函数里面更新谷值的语句前面即可避免连续出现多个谷值。
更新后的函数用于整段投篮数据02 221.txt:
在数据点3000前后,由于后一个动作的峰值与前一个动作的谷值差值不够大,检测不到峰值,因此在detectnewstep函数里添加条件:如果当前时间比上一个谷值出现的时间大与100,则valleyOfwave ==0,重新初始化谷值,结果如下:
数据点5000左右的峰值点确实符合逻辑,判断成峰值无法避免。
3、尝试手动分割了三个人的数据,分为六类运动模式:高手、低手、交叉、直线、体前、快速,然后打上lable。使用KNN、DT、GNB、SVM分类器分出来准确率只有25…
样本还是太少了,但是每个人的样本数据差距好大啊,作动作的大小、速度都不一样。而且样本数据的格式也不是很对,比如100行数据表示一个动作,现在这100行每行都打上lable为1,打100个lable肯定是不准确的;但如果把一百行数据放在一个数组里再打lable,又会因为每个人的一个动作长度不一定是100行导致样本数组大小不一样,也不行……
4、篮球数据用手臂夹角数据和总加速度求方差、四分位数、变异系数、最大值等,观察发现:手臂夹角数据中直线运球的方差最大,快速运球方差最小,可以作为分类特征加入训练样本数据。其他特征似乎参考价值不大? 但是方差是一百个采样点算出来的一个数据,采样数据一百行才有一个方差,要是想把方差和原始数据都作为训练样本怎么把他们融合到一起呢?