LoginSignup
14

More than 5 years have passed since last update.

ClojureでJubatusを利用してみる(Classifier:多値分類)

Posted at

機械学習フレームワークのJubatusをClojureから利用するサンプルを作ってみました。
今回はClassifier(多値分類)のサンプルです。
公式サイトの Python Ruby Java のサンプルと内容は同じですので詳細はそちらを参照してください。

まずは、Leiningenで作ったプロジェクトでJubatusのJavaクライアントライブラリを使用する依存設定をしておきます。

project.clj抜粋
  :repositories [["jubatus" "http://download.jubat.us/maven"]]
  :dependencies [[us.jubat/jubatus "[0.6.,)"] [org.clojure/clojure "1.6.0"]]

jubaclassifier -f shogun.jsonでJubatusサーバを起動しておいて、以下のコードを実行すると

core.clj
(ns jubatus-sample.core
  (:import [us.jubat.classifier ClassifierClient LabeledDatum]
           [us.jubat.common Datum]))

(def train-data
  {"徳川" ["家康" "秀忠" "家光" "家綱" "綱吉" "家宣" "家継" "吉宗" "家重" "家治" "家斉" "家慶" "家定" "家茂" #_"慶喜"]
   "足利" ["尊氏" "義詮" "義満" "義持" "義量" "義教" "義勝" "義政" "義尚" "義稙" "義澄" "義稙" "義晴" "義輝" "義栄" #_"義昭"]
   "北条" ["時政" "義時" "泰時" "経時" "時頼" "長時" "政村" "時宗" "貞時" "師時" "宗宣" "煕時" "基時" "高時" "貞顕" #_"守時"]})

(defn- make-datum [value]
  (.addString (Datum.) "name" value))

(defn train [client]
  (let [data (for [[k v] train-data]
               (map #(LabeledDatum. k (make-datum %)) v))]
    (.train client (shuffle (apply concat data)))))

(defn predict [client]
  (let [names ["慶喜" "義昭" "守時"]
        data (map #(identity [% (make-datum %)]) names)]
    (doseq [[n d] data]
      (->> (.classify client [d]) first (apply max-key #(.-score %)) .-label
           (#(println % n))))))

(def client (ClassifierClient. "127.0.0.1", 9199, "test", 1))
(train client)
(predict client)

以下の結果がプリントされました。うまく分類できているようです。

結果
徳川 慶喜
足利 義昭
北条 守時

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14