機械学習フレームワークの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)
以下の結果がプリントされました。うまく分類できているようです。
結果
徳川 慶喜
足利 義昭
北条 守時