[JAVAとlibsvm]今日は超頑張ったから話しを聞いてほしい。

こんにちはよつやです。
僕はクリスマスは海未ちゃんドールと一緒に楽しく過ごしました。
当日は髪を丁寧に洗ったり、新しい洋服を着させたりと何かと楽しんでいた次第です。
海未ちゃんドールについては次回にでも紹介したいと思います。

さて、今日は超頑張ったので、ちょっとそのことについて書こうと思います。
要は、褒めて褒めて!!ということ。
それと、今日一日苦しんだlibsvmをどうにかこうにか、Javaで動かす方法をちょこっと紹介します。

話は遡ること先週の火曜日。
研究室の先生から「よつや君。後でメール見ておいて。無茶振りをしたから頑張って!」と。
卒業研究の忙しいさなか何だか嫌な予感がしないこともない・・・と思いながらメールを見てみたところ・・・。
内容は簡単に要約すると「キミの研究、機械学習させて見たら面白そうだからプログラム作って結果を教えてね。ついでに来年授業でやってみるつもりだから頑張って」的な内容。
まあ、まあ、日頃から先生にはかなりお世話になってるし、少しぐらい頑張ってみないとね。それに研究室には大学院生もいるのにわざわざ学部生の僕に送られてくるあたりちょっとは期待してくれてるのかな?と思ってみたり思わなかったり。
まあ、実力だめしにやってみようと。

まず、SVMとはというところ。
SVMの最大の特徴はマージン最大化というものなのですが、実際の所僕もよく分かってないのです。
というか、とにかくプログラムを完成させよ・・・と頭のなかで何かが・・・という状況だったので。
まあ簡単に言うとA、B、Cの3つの属性があったとき、何がAに属して、何がBに属して、何がCに属するのか?みたいなのをいい感じにやってくれるすげーやつ。という感じらしい。
ちなみに、僕は自然言語処理系の研究をやっていて、その延長上に今回のSVMのようなものがあるんですね。

やった結果・・・
1_20161227001616562.png
出来ました!
しかもちゃんとGUIアプリケーションとして動く。なので、授業で使うであろうプログラミングがよくわからない学生でも解析させるテキストを選択するだけでなんとポイポイポーイなのである。

しかも。
3_20161227001619ea1.png
選択したファイルがテキストファイルじゃない場合ちゃんと”NG”と表示して間違っていることを教えてあげる親切設計。
ちなみに2学習データオプションと言う所は本来何も知らない人が使うには不要なのですが、ここはわかっている学生もいるだろうということで、上級者設定ということで設定項目まで追加。
しかも、仮にオプションの文字、番号が間違っていた場合はちゃんと”NG”と教えてくれる親切設計なのです。

ちなみに、これは解析している所。
4_20161227001621d7b.png
テスト用に適当に作ったファイルなので数値等もおそらくデタラメだと思います。
まあこんな感じで今日丸一日かけて完成したわけですね。
まず午前中はSVMとは~的なことをお勉強し、どんなライブラリを使うか~みたいなのを考えました。
午後はひたすらテストプログラムを書いて検証作業でした。

ちなみに開発推移はこんな感じ。

当初目標:ライブラリのソースコードを持ってきて中身を書き換えて使う。
お昼頃:書き換えたけど上手く行かねー。
3時頃:方針変更、ライブラリのZIPファイルにあったexeファイルをJavaのProcessを使って外部起動、結果を受取る。
3時半頃:その前に、テキストデータをlibsvmに対応した形式に変換するコードを書かなきゃ・・・(ここは完全自作、ライブラリなしなのだ!)
6時頃:検証完了。ただし、現状はコマンドラインでしか使えないので、GUI環境(上の画像のやつ)で使えるようにする。
11時頃:完全自作のテキスト変換にミスがあることが発覚。書き直し。
12時頃:無事GUI環境でのテストも完了。開発終了!

と言った感じでした。
今回の何が一番きつかったって、殆どの文献がLinux上で動作すること前提だったこと。ちょっとはWindowsでもやってよ・・・
そのためにUbuntuでも環境を整えて出力データの比較を行ったり、色々苦労しました。
というか、なんでみんな、exeファイルのやつ使わないの?いや、ライブラリをいじる実力があるから必要ないのか・・・。

更にもう一ついうと、途中から初月に「また、お前か、なんだ寂しいのか?」となだめてもらいたくて艦これを起動したら、なんとDMMのサーバーがダウンしてるじゃん?
もう、やめてくれよ~。
いや~でも初月可愛いですよね。クールな感じなのだけど、包容力があるところとか。もう最高です。

一時は頭が破裂するんじゃないかと思いましたが、なんとか完成しました。
いや~疲れた。
今回ので一つ思ったこと。外部ライブラリはProcessで起動して”勝手にやってくれ戦法”で行くのが一番だと。
間違っても今回の僕のようにjavaファイルいじって自分仕様にしてやるぜなんて思わないことだなぁ~(遠い目)。

ちなみに、JavaのProcessはこんな感じで動きます。

Runtime rt = Runtime.getRuntime();
Process p = rt.exec("~.exe 必要ならoptionも書いても大丈夫");
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String result;
while ((result = br.readLine()) != null) {
System.out.println(result);
}

これで、外部の.exeファイルも実行できます。
案外これは使い用途が多いので知っておくと便利ですよ。
そうそう、この前友達のブログを見たら、案外こうITっぽい記事とかあったのでちょっと僕もやってみたかった。まあなんとなくそれっぽいでしょ?
とにかく、終わってほんとよかった。

というわけで、これから艦これして寝ます。
以上です。

いかがでしたか?
ではまたお会いしましょう!
今日もいい日でありますように!
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

よつや

Author:よつや
こんにちはよつやです。
主にPC関係の記事を書いていきます。
コメントやメッセージ大歓迎です。
相互リンクなども遠慮なくお申し付けください!

アクセスランキング
[ジャンルランキング]
コンピュータ
520位
アクセスランキングを見る>>

[サブジャンルランキング]
その他
97位
アクセスランキングを見る>>
twitter
カテゴリ
最新記事
RSSリンクの表示
最新コメント
最新トラックバック
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

リンク
検索フォーム
RSSリンクの表示
QRコード
QR