taiyoh's memorandum

@ttaiyoh が、技術ネタで気づいたことを書き溜めておきます。

Data::ChangeFinderとData::AnomalyDetectなんてもんをこしらえてみた

 → taiyoh/p5-Data-ChangeFinder · GitHub
 → taiyoh/p5-Data-AnomalyDetect · GitHub
 fluent-plugin-anomalydetectの動作がかっこよかったので、もうちょっとfluentに頼らずにカジュアルに使えないかな、と思ったのが発端です。
 変化点検出のアルゴリズムはいくつかある、というところまではググって分かってきたのですが、じゃあそれらをPerlで1から実装できるのか、というとそこまでの力はないので、謹んでfluent-plugin-anomalydetectに入っていたFluent::ChangeFinderの実装をごっそりPerlに移植させていただきました。内部が理解できてないのに移植できるのかよ、ってのは全くその通りなのですが、とりあえずリファレンスになるruby側の実装を、同梱されてたテストデータのcsvを使って単体で実行してみて、その結果データと移植したPerl側の実行結果を照合させて、誤差が0.1%もなければ(内部でrand使ってるので、確実に同一の値にはなることはない)、ほぼ期待の動作になっているのではないか、という論拠のもとに移植しております。
 検出部分のモジュールができれば、あとはそれのインターフェイスになるものがあれば使いやすくなると思ったので、Data::AnomalyDetectというものも作りました。これは、Fluent::AnomalyDetectOutputのコア部分の実装を移植させてもらっております。これで初期化時のパラメータ指定はfluentのプラグインとほぼ同じになります。

 ↑動作サンプル
 あとお節介なこともしてて、AE::timerを使って定期的に検知処理を実行させるData::AnomalyDetect::Watchというのと、tcpで値を受け取ってスコアを返すという部分に特化させたData::AnomalyDetect::Recieveというのも同梱しました。ただ、特にRecieveの方はかなり原始的な作りだと思ってるので、本格的にやるにはもっと色々考慮しなくちゃいけないと思います。
 目下の課題は、ドキュメントを書かないといけないのと、outlier_bufferのデータを永続的に保持する(もしくは初期化時にロードさせる)仕組みが必要だな、というところです。