old school magic

機械学習に関する備忘録です。

Javaで機械学習の勉強は可能なのか?

結論から言うと「可能ではあるけどやめたほうがいい」って感じです。

僕はJavaが好きです。eclipseの支援は素晴らしいです。研究やってると過去のコードが動かないことが結構あるので、「write once, run anywhere」の精神が大好きです。いちいち例外投げるところやエラーを吐きまくってくれるところが口うるさい恋人のように愛おしいです。javadocは人類最大の発明だと思っています。何より書いていて安心します。


なのでJava機械学習の勉強をしようと決心し、ここ一年ほど頑張ってはみました。
Javaには素晴らしいライブラリが山ほどあります。
行列であればJAMAがシンプルで便利です。
数値計算や確率分布はcommons-mathがあります。
これだけの支援があればJavaでも十分機械学習ができると確信していました。


  • いちいち新しい確率分布を定義するのが辛いです。commons-mathにない分布を実装するのが辛いです。
  • ライブラリを使うたびにラッパー書くのが辛いです。でもラッパー書かないと後でもっと辛いです。
  • 行列計算が遅いです。疎行列が欲しいです。
  • ベクトルクラスを定義したいのにjava.lang.Vectorのせいで踏みきれません。名前空間さえ侵食してくる気がします。
  • 数値計算が読みづらいです。演算子のオーバーロードに対応してください。


僕のプログラミング能力の無さが原因ではあるのですが、機械学習、特にベイズ統計の分野はJavaで学ぶより他の言語で学んだほうが効率が良いと思います。
まあようするに数式に入る以前のインフラの整備に時間が取られて辛いです。


なぜJavaにこだわっているかというと、Javaで実装しておけば実際に運用する時に手間が省けると思ったからです。
Play frameworkでScalaから呼び出したり、androidにそのまま移植できたりすれば素敵じゃないですか。
自分の研究を自分でサービスに実装してプレゼンできるようになりたいです。


でもこのままだと勉強が進まなくて辛いので、他の言語で勉強をして、サービスやアプリで実装する部分だけ後でJavaで書き直すことにします。


さらばJava, いつか機械学習を身につけ、ライブラリ書いてScalaから呼び出す日まで。


追記 : Wishart分布をjavaで実装しました。