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の資産を使えるのはありがたいですね。