0.初めに
卒論のファイルの存在が虚無な中の人です.こんな時期にブログを書くなんて思っていなかったのですが,現役からの
熱い圧力強い要望により書いています.今回は異常検知したかった話です.
1.異常検知とは
異常検知(
anomaly detection)は,"
通常の動作として明確に定義された概念に準拠しないデータパターン"(
wikiより)を検出することで,いろいろな分野で使われています.
まあいつもの動き(狙った動き)と違うぞってことを見つけるって話です.
2.PID制御ぶるぶる問題
マウスに限らず,限界感度法とかでPID制御のパラメータを決めている場合,パラメータを上げすぎると出力が発散(振動)することがあります.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM_s5g0mbXOkXlBk1aWabgZKmHf9a61jjNiF4iMxVTnIwZOF4EoCylqN3uJ4It2yAWvUjUHqCKfUS1zW1GHDwBibacWsKwqnY_gWqSjq7buozaOAT-6Gagh-TXwt6aU2hQiBnN9D2hJS0/s640/Section2_raw_data.png) |
見事に発散 |
別に適切なパラメータであれば問題はないのですが,どんな環境でも動くパラメータを見つけ出すのは至難の業.なので少し高めのパラメータをデフォルトに設定し,出力が発振しかかったらパラメータを下げるようにしてみました.
3.そうだ,検出しよう
さて,出力の発振を検出して...ってどうやって?ここで出力データをよーく見てみましょう.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg144LG-hlNXaTrP-gNbK73iMCIgIpyEHFpY1BsDbN0JyDdLSNBOcBeXWH_2e1l4ryyOXci4LomJeY8_J-c__ZKmNkzJhyPW3lLi0gY_NYLo-C_77fRXBSEce1XNfacwvYldEN1VA3sMig/s640/Section2_raw_data_expand.png) |
出力とにらめっこ |
何となくですが,比例制御で使う偏差の絶対値をとって,その値をテキトーな区間(半周期あたり)で積分すればいい気がしてきました.制御が荒ぶっているときは値が大きくなって,安定しているときは値が小さくなりそうです.あとはしきい値決めてぶった切れば勝ち確かな?
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqSCHb1Qe7HX8q4QDf-KeGpAWJGTpcEvb2lDYQfole_oCbtYtOrRSHxxRB_zYtl8WwppeuXCdBygqvNOeNalZVL0bmbsKUtaRgMiAHBYJuwpBlSIuW5aiLon2mGoONzSaQY2LkRWTAFak/s640/Section3_detection.png) |
検出できた??? |
4.わたし,(誤検知)気になります!
3.で考えた検出方法にはある問題があります.アンダーシュート/オーバーシュートして安定している場合です.元データでは,加速度がノンゼロの区間の遅れが誤検知されています.勝ち確#とは.(※実はこの方法でもどうにか検出することもできたりできなかったり)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioufP_Z0OmbsOO12QXYJXZp_szVttB186vqIzkWt76ZC__6sp0IFopiz3_dBgHOIlCxu_3kCXD09B5VQFB-PTk9qEF6gd_I5EcW8IV0Qx-R9Zwe2CLQ_9JAUWmItEbfc49PaGluiigbGE/s640/Section3_detection_with_raw_data.png) |
やっぱり駄目だったよ |
となると方針変更です.偏差を何か,入力データの変動のみを表すものに置き換えてやればできそうです.
ある関数の変動を見るとすれば...ああ,微分なんてあったなぁ.まあ厳密に数値微分なんてする必要はないので,もういっそ引き算だけすればいいでしょう(やけくそ).
5.そして,よくわからないものへ
さて,結果です.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvFmRWISdnOVO0SALjzpfuVa2A2ZZVJtXFO1EvIooMH3ihuWbVqmNoHFHeyu3g9uAY3V5FATdUpmR6zf7Ldf1FI1R__uLNcbxXdrUXbKvZq5vFpoapZD59FDK1ubR12nMWkZUttp2qxDc/s640/Section5_detection.png) |
さっきよりイケそう |
差分だけならよさげなので,最初のデータと合わせて確認してみましょう.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZx6Oa5gIl2Ghm8GphajGOlZ2W_5QrxkLoDWW5_3uFN_OJmR6oFMeUydzBlHErXsH5yzFgpHyYEBz4irjaPirL5WTR8NESzXU-QR4yYmXmS0FjxN4PrS-VdmDVvso5jwTxnoLYSEL8ww/s640/Section5_detection_with_raw_data.png) |
イケたのでは |
とりあえず,誤検知が無くなりました.めでたしめでたし...なんてことにはならない.
実機にぶち込んで動いたら完全なる勝利です.さて,やってみましょう.
あれ,思ったよりも誤検知多いのでは?とりあえずは安定して動いているので,良しとします.
結論.
異常検知は難しい...が,マウス君はちょっとだけ安定するようになった.このやり方であってるかどうかは知らないです.もっといい方法があったら教えてください.
おまけ : 偏差だけで異常検知はできるのか?
3.で作った偏差だけを使うやり方では誤検知が多いという話をしました.が,実はそこで議論していないことがありました.しきい値です.
具体的な値を言えば,3.の場合0.1をしきい値としていました.ここでしきい値を0.5に上げて比べてみましょう.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMasELSg4r-7ya6uyR6EtNFUFGPrsNVKdJQNaVR1PEKx9sXYgKz_gp8x2hNesYIxr1LiZe-GLSoV-QqXw4D1eRKl8fOq-9avrvT4cXtP3-xM5qc70OR0LsacvVaQMZp1zo1TwecexR-H8/s640/Section6_omake.png) |
あれ,こっちもできてる |
どうやらうまく検出出来ているようです.ですが,4.の方法のほうがパラメータがテキトーでも成功しやすいと感じました.この辺の話はリソースとかの問題もあるので,一概にどちらのアルゴリズムがいいかを決めることはできませんが,まあ好きな方を選んでください.
おまけ2 : タイトルと内容について
タイトルと内容の決定のながれは
こちらのツイート及び
コヒロさんの
2019年全日本大会で人権を取り戻した話の最後のほうを参照のこと.
©2019 shts All Right Reserved.