Stat チュートリアル (Python)¶
ここではPython版のStatサンプルプログラムの解説をします。
ソースコード¶
このサンプルプログラムでは、学習の設定をするstat.jsonと統計分析を行うstat.pyを利用します。 以下にソースコードを記載します。
stat.json
1 2 3 | {
"window_size": 500
}
|
stat.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from jubatus.stat.client import Stat
NAME = "stat_tri";
if __name__ == '__main__':
# 1. Jubatus Serverへの接続設定
stat = Stat("127.0.0.1", 9199, NAME)
# 2. 学習用データの準備
for line in open('../dat/fruit.csv'):
fruit, diameter, weight , price = line[:-1].split(',')
# 3. データの学習(学習モデルの更新)
stat.push(fruit + "dia", float(diameter))
stat.push(fruit + "wei", float(weight))
stat.push(fruit + "pri", float(price))
# 4. 結果の出力
for fr in ["orange", "apple","melon"]:
for par in ["dia","wei", "pri"]:
print ("sum :", fr + par,stat.sum(fr + par))
print ("sdv :", fr + par,stat.stddev(fr + par))
print ("max :", fr + par,stat.max(fr + par))
print ("min :", fr + par,stat.min(fr + par))
print ("ent :", fr + par,stat.entropy(fr + par))
print ("mmt :", fr + par,stat.moment(fr + par, 1, 0.0))
|
解説¶
stat.json
設定は単体のJSONで与えられます。 JSONの各フィールドは以下のとおりです。
- window_size
- 保持する値の数を指定する。 (Integer)
stat.py
stat.pyでは、csvから読み込んだフルーツの直径・重さ・値段の情報をJubatusサーバ与え、それぞれのフルーツごとに統計結果を出力します。 使用するメソッドは以下になります。
- bool push(0: string key, 1: double val)
- 属性情報 key の値 val を与える。
- double sum(0: string key)
- 属性情報 key を持つ値の合計値を返す。
- double stddev(0: string key)
- 属性情報 key を持つ値の標準偏差を返す。
- double max(0: string key)
- 属性情報 key を持つ値の最大値を返す。
- double min(0: string key)
- 属性情報 key を持つ値の最小値を返す。
- double entropy(0: string key)
- 属性情報 key を持つ値のエントロピーを返す。
- double moment(0: string key, 1: int degree, 2: double center)
- 属性情報 key を持つ値の center を中心とした degree 次のモーメントを返す。
- Jubatus Serverへの接続設定
Jubatus Serverへの接続を行います(12行目)。
Jubatus ServerのIPアドレス、Jubatus ServerのRPCポート番号を設定します。
- 学習用データの準備
Statでは、項目名と値をpushメソッドに与えることで、学習が行われます。 今回はサンプル用に作成した"フルーツの種類"・"直径"・"重さ"・"価格"の情報を持つCSVファイルを元に学習用データを作成していきます。 まず、学習用データの元となるCSVファイルを読み込みます。 ここでは、CSVファイルを1行ずつループで読み込んで処理します(14-21行目)。
- データの学習(学習モデルの更新)
Statのpushメソッドに2. で作成したデータに項目名を付けて渡します(19-21行目)。 ここでの項目名は"直径"の場合、フルーツの種類+"dia"という形にして、"重さ"・"価格"についても同じようにpushメソッドを呼び出します。
- 結果の出力
Statの各統計分析メソッドを使用し、結果を出力します。 まず、フルーツの種類ごとにループをまわして(24行目)、さらに残りの項目ごとにループでまわして出力していきます(25行目)。 そのループ処理の中で、各統計分析メソッドを呼び出します(26-31行目)。 各メソッドの内容は上記のメソッド一覧を参照してください。
サンプルプログラムの実行¶
- Jubatus Serverでの作業
jubastatを起動します。
$ jubastat --configpath stat.json
- Jubatus Clientでの作業
必要なパッケージとPythonクライアントを用意し、実行します。
実行結果:
sum : orangedia 1503.399996995926 sdv : orangedia 10.868084068651045 max : orangedia 54.29999923706055 min : orangedia -2.0999999046325684 ent : orangedia 0.0 mmt : orangedia 28.911538403767807 sum : orangewei 10394.399948120117 sdv : orangewei 54.92258724344468 max : orangewei 321.6000061035156 min : orangewei 39.5 ent : orangewei 0.0 mmt : orangewei 196.1207537381154 sum : orangepri 1636.0 sdv : orangepri 7.936154992801973 max : orangepri 50.0 min : orangepri 6.0 ent : orangepri 0.0 mmt : orangepri 30.867924528301888 sum : appledia 2902.0000019073486 sdv : appledia 15.412238321876663 ... ...(以下略)