参考にさせていただいている元プログラムに対して、テスト動作でバグがあって、SVMが次元が違うと言ってくるエラーから抜け出すのに3日かかりました。
GIST にコードおいてあります。pycharmで作成しました。
https://gist.github.com/dj1711572002/561dbf571f6330d84d95f394cd1a0b5c
修正0:原理的にLinear加速度だと動いている時しか、データがでないので、これだと、ジェスチャーデータが
重複してしまうので、正答率が50-60%程度にしかならないので、静止状態でデータがでる、Gravity加速度に変更して、傾けたままのジェスチャーで、サンプリングして、トレーニンことにしました。
これなら、正解率は100できます。
修正1:トレーニングデータの形式が違っていた。CSV形式から、numpy行列に変換してそのまま突っ込んいたのですが、これだと特徴数が合わないと言われてしまいます。
センサからのサンプリングデータをSVMへ入力するには、データの順序とサンプリング長さでルールあります。
CSV同形式:[[gx[0],gy[0],gz[0]],[gx[1],gy[1],gz[1]],・・・・・・,gx[98],gy[98],gz[98]]
これだとSVMではじかれます。
サンプリングを塊とした配列にします。
SVM用形式:[gx[0],gx[1],gx[2]・・・,gx[98],gy[0],gy[1],gy[2],・・・gy[98],gz[0],・・・gz[98]]
これが一つのジェスチャーで、サンプリングが99データを1単位としてSVMが処理します。
ですので、テストも99データが単位で入力します。
修正2:数値データでなく ASCIIデータの配列として、渡します。
修正3:テストのpredictの直前で、modelファイルを読み込みます。modelファイルをprintしようとprint(model)と
イレギュラーな命令をいれたら、これが原因で、modelが狂ってしまって、SVMが次元が違うエラーがでました。
●結果
①モデル作成
静止したデータなので、100%精度です。動きがはいる精度おちるという単純なものです。
②テスト結果
99個サンプリングで、トレーニング入力と同じプログラムで、テストを行います。
ジェスチャー1は、x軸方向へ傾け、ジェスチャー2は、Y軸方向へ傾け
ジェスチャー3は、水平方向姿勢ですが、ほとんどが3と回答がでてきます。
●感想
SVMは、センサには向かない機械学習だとおもいます。画像の一致しているものを探すとか
膨大な量のデータから、似たものを探しだす用途に向いてます。
●以後
動きがはいった場合は、統計値を入力データとしていれればIMUの動作が生きてくるようなので
統計値でのSVMで自分の日常動作の機械学習にみます。
それができれば、スキーにもいれられるので、STAシステムにも機械学習が入れられるようになります。