LoginSignup
13

More than 5 years have passed since last update.

RspberryPi + センサ + Jubatus 2(機械学習にかけてみる)

Last updated at Posted at 2015-06-08

ディクショナリ型に変換する

前回やったようにMongoDB内のデータを取得してみる.

$ python client.py
{u'_id': ObjectId('5567fbdc94e0343f0673444c'), u'data': 174, u'name': u'lux'}
{u'_id': ObjectId('5567fbdc94e0343f0673444d'), u'data': 176, u'name': u'lux'}
{u'_id': ObjectId('5567fbdd94e0343f0673444e'), u'data': 180, u'name': u'lux'}
{u'_id': ObjectId('5567fbdd94e0343f0673444f'), u'data': 176, u'name': u'lux'}
{u'_id': ObjectId('5567fbde94e0343f06734450'), u'data': 177, u'name': u'lux'}
{u'_id': ObjectId('5567fbdf94e0343f06734451'), u'data': 186, u'name': u'lux'}
{u'_id': ObjectId('5567fbdf94e0343f06734452'), u'data': 177, u'name': u'lux'}
{u'_id': ObjectId('5567fbe094e0343f06734453'), u'data': 174, u'name': u'lux'}
{u'_id': ObjectId('5567fbe094e0343f06734454'), u'data': 185, u'name': u'lux'}
{u'_id': ObjectId('5567fbe194e0343f06734455'), u'data': 175, u'name': u'lux'}
{u'_id': ObjectId('5567fbe194e0343f06734456'), u'data': 177, u'name': u'lux'}

MongoDBに保存されているデータはJSONではなくBSONです.JSONには
ObjectId('5567fbdd94e0343f0673444f')
のような括弧付きの表記はないです.今回は,IDとか特に使わないだろうし,ID自体消してしまおうかと思います.消してしまえば,JSON形式に変換できるようになります.

最終的に教師データとして渡すには,JSON形式ではなく,ディクショナリにしておきます.なので
BSON → JSON → ディクショナリ
という流れで変換を進めます.

client.pyを書き換えてみましょう

client.py
# usr/bin/env python
# -*- coding:utf-8 -*-

from pymongo import MongoClient
import json

class getmongo:
    con = MongoClient('172.16.4.83', 27017)
    db = con["sensordb"]
    col = db.sensors

    for data in col.find({'name':'lux'}):
        del data['_id']
# BsonをJsonに変換
        json_list = json.dumps(data)
# Jsonをディクショナリに変換
        print json.loads(json_list)

実行してみると

$ python client.py
{u'name': u'lux', u'value': 184}
{u'name': u'lux', u'value': 183}
{u'name': u'lux', u'value': 182}
{u'name': u'lux', u'value': 185}
{u'name': u'lux', u'value': 192}
{u'name': u'lux', u'value': 190}
{u'name': u'lux', u'value': 186}
{u'name': u'lux', u'value': 186}
{u'name': u'lux', u'value': 185}
{u'name': u'lux', u'value': 192}
{u'name': u'lux', u'value': 193}
{u'name': u'lux', u'value': 191}
{u'name': u'lux', u'value': 187}
{u'name': u'lux', u'value': 187}
{u'name': u'lux', u'value': 185}
{u'name': u'lux', u'value': 182}
{u'name': u'lux', u'value': 183}
{u'name': u'lux', u'value': 188}
{u'name': u'lux', u'value': 191}
{u'name': u'lux', u'value': 188}
{u'name': u'lux', u'value': 186}
{u'name': u'lux', u'value': 187}
{u'name': u'lux', u'value': 187}
{u'name': u'lux', u'value': 185}

ディクショナリ型に変換出来ました.

センサ値を機械学習にかけてみる

Jubatusチュートリアルのanomalyを参考にプログラムを作成します.

http://jubat.us/ja/tutorial/anomaly_python.html

その前に!先ほど作成した,BSONからJSONに,そしてディクショナリ型に変換するプログラムclient.pyを利用できるようにしたいです.ディクショナリをメインクラスに渡せるように関数を追加します.

client.py
# -*- coding:utf-8 -*-

from pymongo import MongoClient
import json

class getmongo:
    con = MongoClient('172.16.4.83', 27017)
    # con = MongoClient('192.168.1.104', 27017)
    db = con["sensordb"]
    col = db.sensors
    global dic
    dic = {}
    count = 0

    for data in col.find({'name':'lux'}):
        del data['_id']
# BsonB$rJsonB$KJQ49
        json_list = json.dumps(data)
# JsonB$r%G%#%/%7%g%J%j$KJQ49
        dic[count] = json.loads(json_list)
        count += 1

    def getDic(self):
        return dic

そして,Jubatusのanomalyを利用してみましょう.

jubalux.py
# -*- coding: utf-8 -*-

import sys, json
from jubatus.anomaly import client
from jubatus.common import Datum
from pymongo import MongoClient
from client import getmongo

NAME = "lux";

if __name__ == '__main__':

    # 1.Jubatus Serverへの接続設定
    anom = client.Anomaly("127.0.0.1",9199,NAME)

    # 2.学習用データの準備
    getmongo =  getmongo()
    dic = getmongo.getDic()
    name = ''
    value = 0
    for line in dic:
        name = dic[line]['name']
        value = dic[line]['value']
        datum = Datum()

        for (k, v) in [
                ['name', name],
                ]:
            datum.add_string(k, v)

        for (k, v) in [
                ['value', value],
                ]:
            datum.add_number(k, v)

        # 3.データの学習(学習モデルの更新)
        ret = anom.add(datum)

        # 4.結果の出力
        if (ret.score != float('Inf')) and (ret.score!= 1.0):
            # print ret, label
            print ret

実行するとこうなります.

$ python jubalux.py
id_with_score{id: 2005, score: 1.30903303623}
id_with_score{id: 2008, score: 1.26389038563}
id_with_score{id: 2015, score: 0.999999523163}
id_with_score{id: 2016, score: 1.00000071526}
id_with_score{id: 2017, score: 0.925925433636}
id_with_score{id: 2018, score: 1.00247001648}
id_with_score{id: 2019, score: 1.41665911674}
id_with_score{id: 2039, score: 2.05128192902}
id_with_score{id: 2050, score: 1.01709413528}
id_with_score{id: 2052, score: 1.02777767181}
id_with_score{id: 2061, score: 1.1565656662}
id_with_score{id: 2063, score: 1.02314817905}
id_with_score{id: 2077, score: 1.47916650772}

異常検知の重みは,config.jsonを書き換えればうまくいく気がします.今回はとりあえず異常検知の結果はどうであれ,Jubatusを利用した機械学習を行うことが出来ました.

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
13