Jubatusを使ってみた
前回、Scalaで機械学習などをサポートすることを目的としたScalaNLPを紹介しました。
しかし、ScalaにはJavaの資産を使えるというメリットがあるので、今回はJavaを利用して、PFIが開発しているリアルタイム解析基盤Jubatusを使ってみました。
Jubatusについて
Jubatusは「分散したデータ」を「常に素早く」「深く分析」することを狙った分散基盤技術です。
Jubatusの名前の由来は、俊敏な動物であるチータの学術名からの命名で、「ユバタス」と読みます。株式会社Preferred InfrastructureとNTTソフトウェアイノベーションセンタが共同開発した、日本発のオープンソースプロダクトです。
最終的に全ての人にスケーラブルなオンライン機械学習フレームワークを提供することがJubatusの目標です。
Jubatus は以下の特徴を持ったオンライン機械学習向け分散処理フレームワークです。
オンライン機械学習ライブラリ: 多値分類、線形回帰、推薦(近傍探索)、グラフマイニング、異常検知、クラスタリング
特徴ベクトル変換器 (fv_converter): データの前処理と特徴抽出
フォルトトレラントな分散機械学習のためのフレームワーク
Jubatusのインストール
私の環境はCentOSです。他の環境の人も公式を見れば簡単にインストールできると思います。
sudo rpm -Uvh http://download.jubat.us/yum/rhel/6/stable/x86_64/jubatus-release-6-1.el6.x86_64.rpm sudo yum install jubatus jubatus-client
Jubatusを利用するクライアントも提供されています。
C++, Python, Ruby, Javaが書かれています。
…
…
あれ、Scalaないな?
本来ならば、「Scalaクライアントを実装してみた」と言いたいところですが、それは大変なので、Javaクライアントを利用して使ってみます。
使ってみる
Sbtを利用してコンパイルするスケルトンがないので、ほぼJavaクライアントをパクって自分で用意しました。
hase1031/jubatus-scala-using-java-client
このクライアントの初期コードでは、ユーザーが3人いて、どのユーザーがどのユーザーに似ているかを判別するプログラムが用意されています。
// user01 val d1 = new Datum().addNumber("movie_A", 5).addNumber("movie_B", 2) .addNumber("movie_C", 3) r.updateRow("user01", d1) // user02 val d2 = new Datum().addNumber("movie_A", 2).addNumber("movie_B", 5) .addNumber("movie_C", 1) r.updateRow("user02", d2) // user03 val d3 = new Datum().addNumber("movie_A", 5).addNumber("movie_B", 1) .addNumber("movie_C", 4) r.updateRow("user03", d3)
コードを見てわかるように、映画Aと映画Cを高評化しているのは、ユーザー1とユーザー3。
逆に、ユーザ−2は映画Aと映画Cを低評価、映画Bを好評化しています。
Jubatusの起動
jubarecommender --configpath /usr/share/jubatus/example/config/recommender/lsh.json &
Configのパスは人によって異なります。
クライアントの実行
sbt run
user01 is similar to: user01 (1.0), user03 (0.921875), user02 (0.765625), user02 is similar to: user02 (1.0), user01 (0.765625), user03 (0.6875), user03 is similar to: user03 (1.0), user01 (0.921875), user02 (0.6875)
ユーザー1とユーザー3がよく似ているという結果がでました。
簡単!
まとめ
Jubatusは今回のリコメンド以外にも分類だったり、回帰だったりといろいろできるので試していきたい。
Javaの資産を使えるのはありがたいですね。