NetBeansのメモリ使用ログから
機械学習で
きしだが働いてるかどうか判定する
2017/2/11 きしだ なおき
きのう
● おきたら18時
● 登壇者懇親会19時から
作戦
● プラン特A
– 資料も完璧、デモまでやる
● プランA
– 動作はする。資料も完璧。デモはできない
● プランB
– 動作しなかったので、やろうと思ったことの資料つくってプレゼン
● プランC
– なんも用意していないのでいきあたりばったりやる
作戦
● プランC+
– 動作したけど資料ができてないので
いきあたりばったりやる
今日のはなし
● NetBeansのメモリログから、機械学習で
きしだが働いてるかどうか判定する
メモリログ
● ヒープの使用量
あそんでる あそんでるなんかしてる
どう取るか
● JMXという仕組みがある
● InfluxDBにつっこむ
● Grafanaで見る
構成
なんかプログラム
JMX
https://github.com/kishida/analyzenb/blob/master/src/main/java/kis/analyzenb/JmxInflux.java
問題
● 単純な閾値では判定できない
● 時系列データの判定は単純な機械学習では
難しい
ウェーブレット変換
● 時間ごとの周波数解析を行う
● フーリエ変換
– データ全体の周波数解析を行う
● 離散ウェーブレット変換
– 処理も簡単
http://d.hatena.ne.jp/nowokay/20161227
ウェーブレット変換のコード
static List<List<Double>> wavletAnalysis(List<Double> data) {
List<List<Double>> wavlets = new ArrayList<>();
while(data.size() > 1) {
List<Double> wavlet = new ArrayList<>();
List<Double> next = new ArrayList<>();
for (int i = 0; i < data.size(); i += 2) {
wavlet.add((data.get(i) - data.get(i + 1)) / 2);
next.add((data.get(i) + data.get(i + 1)) / 2);
}
wavlets.add(wavlet);
data = next;
}
wavlets.add(data);
return wavlets;
}
ウェーブレット変換でできること
● 情報圧縮
– JPEG2000で使われている
● 電子すかし(ステガノグラフィ)
– 人間にはわからないように情報を画像などに
埋め込む
上位1/4の周波数成分だけ残してウェーブレット逆変換
http://d.hatena.ne.jp/nowokay/20161229
ウェーブレット変換の適用
● 512データ(8分30秒)をウェーブレット変換
する
● 512 = 2^9
– 9+1=10周波数のデータができる
機械学習
● ディープじゃないラーニング
● 3層のニューラルネットワーク
● 各時間ごとに10個のデータ
● 出力は1つ
● 10 -> 5 -> 1
https://github.com/kishida/analyzenb/blob/master/src/main/java/kis/analyzenb/BackPropergation.java
教師データはどうする?
● 機械学習では、学習用に、入力値とその入力が
どう判定されるべきかという教師データが必要
Thread count
● NetBeansが使っているスレッド数
● NetBeansを触ってないときはスレッド数が32
● 教師データに使える
機械学習とか不要では?
● ロマンです
結果
● なんとなく判定できている
https://github.com/kishida/analyzenb/blob/master/src/main/java/kis/analyzenb/UsageData.java
まとめ
● 時系列データのウェーブレット変換からなんと
なく状態を把握することができた
● 常に働いていれば判定など不要

NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する