TensorFlowで位置情報を人工知能してみる

ここではサンプルのビーコンからの位置情報を使ってTensorFlowで機械学習し、ビーコンで検知された動線の違いからアマチュア/普通/プロの判定をしてみます。

# Beaconからの位置情報を可視化する
1. [ビーコンの位置情報を可視化する](http://qiita.com/egplnt/items/d8ad8a703d1d4b94d657)を参照し、ビーコンからの位置情報を可視化します。
2. Beaconから取得した位置情報の差分を算出します（例：地点１→２の移動時間、地点２→３の移動時間、等）

![スクリーンショット 2016-10-31 16.05.50.png](https://qiita-image-store.s3.amazonaws.com/0/125842/d2eb2a4a-f990-29a1-f111-8b8921ce3b46.png)


# TensorFlowを準備する
1. [TensorFlowを使ってIoTデータを人工知能してみる](http://qiita.com/egplnt/items/3246711349bc1d97bdb8)を参照してTensorFlowを用意します
2. 下記のようなサンプルを用意し、位置情報を学習させます

```py:iot_results_loader.py
# -*- coding: utf-8 -*-

import pandas as pd

class IoTResults:

    def __float__(data):
        return 1.0

    def __init__(self, data):
        self.raw  = data.copy()
        self.data = data

    def predictor_data(self):
        return self.data

    def train_data(self):
        return self.__drop_outcome(self.__train_data())

    def test_data(self):
        return self.__drop_outcome(self.__test_data())

    def train_up_down(self):
        return self.__good_bad(self.__train_data()["outcome"])

    def test_up_down(self):
        return self.__good_bad(self.__test_data()["outcome"])

    def __train_data(self):
        # 全データの 2/3 を訓練データとして使用
        return self.data.loc[lambda df: df.index % 3 != 0, :]

    def __test_data(self):
        # 全データの 1/3 をテストデータとして使用
        return self.data.loc[lambda df: df.index % 3 == 0, :]

    def __drop_outcome(self, data):
        return data.drop("outcome", axis=1)

    def __good_bad(self, outcome):
        return outcome.apply(
            lambda p: pd.Series([
                1 if p <=  0 else 0,
                1 if p ==1  else 0,
                1 if p > 1  else 0
            ], index=['amateur', 'regular', 'pros']))


class IoTResultsLoader:

    def retrieve_iot_data(self):
        df = pd.DataFrame(
            {'move1to2': [25,27,56,30,33,27,65,8,28,26,33,55,31,7,31,52,27,29,31,30,28,61,28,7,30,31,58,33,31,29,27,8,31,30,58,61,29,31,27,31,33,9,29,30,33,28,31,33,30,59,29,27,28,10,31,33,29,9,29,57,31,32,30,29,33,32,34,29,32,8,29,30,31,30,29,28,3,56,29,31,33,9,30,31,33,29,31,30,31,55,32,31,30,28,31,9,33,32,33,32],
              'move2to3': [12,14,32,12,11,14,32,2,15,14,13,32,15,2,12,43,18,14,15,12,13,34,14,4,15,14,29,14,15,14,14,2,15,14,38,36,18,14,17,15,15,2,18,16,15,14,15,16,17,38,17,15,14,3,18,16,15,2,15,33,14,15,16,15,12,13,17,15,14,2,16,15,16,14,16,18,15,32,15,16,18,1,15,14,16,18,14,15,13,34,18,14,16,16,15,3,14,15,16,14],
             'move3to4': [20,18,25,21,23,25,26,8,19,18,20,48,22,6,24,42,23,19,20,18,23,35,22,6,24,22,40,19,20,30,22,7,28,24,33,28,25,30,28,29,27,6,12,20,18,20,22,21,22,34,28,30,26,7,25,20,19,6,21,27,18,20,18,20,24,26,22,28,24,8,24,25,21,22,28,26,19,32,23,21,24,6,21,20,19,22,25,27,26,34,24,20,23,19,22,7,27,23,24,18],
             'move4to5': [50,44,58,56,48,42,60,40,58,54,56,60,44,40,58,62,50,52,54,56,48,46,50,42,56,60,64,52,56,60,58,44,44,48,54,52,56,60,62,64,58,48,58,48,48,50,54,60,62,52,48,44,50,54,52,58,46,48,50,56,62,60,54,48,44,52,54,58,50,48,48,52,58,62,60,52,60,58,56,48,44,52,56,54,58,48,52,54,50,58,54,56,62,60,60,52,48,46,58,48],
             'outcome': [1,1,0,1,1,1,0,2,1,1,1,0,1,2,1,0,1,1,1,1,1,0,1,2,1,1,0,1,1,1,1,2,1,1,0,0,1,1,1,1,1,2,1,1,1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,0,1,1,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,1]})
        return df


```
 
# 3. 実行します

1. `python train.py`で学習させます
![スクリーンショット 2016-10-31 16.10.44.png](https://qiita-image-store.s3.amazonaws.com/0/125842/20721135-8dc7-f8c9-7181-261e3118e3c7.png)

2. `python server.py`でサーバーを実行します
3. 上記のNode-REDのフローからアクセスし、amateur/regular/prosの判定を確認します
![スクリーンショット 2016-10-31 15.12.10.png](https://qiita-image-store.s3.amazonaws.com/0/125842/cb54d68d-5a2b-afe6-0a8e-d060d209c6a8.png)

4. `python -m tensorflow.tensorboard --logdir=./logs`などでtensorboardを稼働しブラウザで`（TensorFlow稼働サーバー):6006`へアクセスして学習の状況などを確認します
![スクリーンショット 2016-10-31 16.17.34.png](https://qiita-image-store.s3.amazonaws.com/0/125842/56f7a455-c856-47a9-9d11-3e9c90f936dc.png)
![スクリーンショット 2016-10-31 16.17.43.png](https://qiita-image-store.s3.amazonaws.com/0/125842/8e003694-cf2a-a1ed-de28-b123ac8b78ed.png)


### 参考

[TensorFlowを使った為替(FX)のトレードシステムを作るチュートリアル](http://qiita.com/jiji_platform/items/268377c542706e6f44b1)を大変参考にさせていただきました。どうもありがとうございます。