不器用なエンジニア見習いのメモ

プログラミングなどのIT関連について学んだことをメモ代わりに書いていきます。 その他興味のあることについても書いていきます。 最近は機械学習に関することをまとめています。 HTML,JavaScript等を使って簡単なゲームを作成して公開しています。

2016年07月

機械学習のプログラムについては勉強も兼ねてgitでバージョン管理をすることにしました。
以下はそのメモです。



参考「http://qiita.com/wnoguchi/items/f7358a227dfe2640cce3」
「https://git-scm.com/book/ja/v2」

git 初期設定について

・ユーザー情報の設定
git config --global user.name "* *"
git config --global user.email "username@example.com"

・エディタの設定
git config --global core.editor 'vim -c "set fenc=utf-8"'


git diffに色付け
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto



・push方式の指定

git config --global push.default simple


・設定の確認
git config --list

★機械学習用のディレクトリ
ここからはこのディレクトリを参照する。

home/ML01

・リポジトリの設定
(「ML01」ディレクトリで)
git init

「.git」という隠しディレクトリが出来る。構成は以下の通り。
[root@localhost ML01]# ls .git
COMMIT_EDITMSG  branches  description  index  logs     refs
HEAD            config    hooks        info   objects


*既存のリポジトリのクローンする場合。(SVNで言う「チェックアウト」のこと。)
git clone https://*/*/*

・ファイルの追跡
最初は下位のファイルがgitの監視対象(もしくは追跡対象)になっていない為、下記のコマンドで追加する(stageする、とも言う)
git add <パス、ファイル名>(プロジェクトのルートディレクトリでも良い)


例(まずは下記の「status」サブコマンドで状態を確認する)

[root@localhost ML01]# git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    kabu/
    sum2/

nothing added to commit but untracked files present (use "git add" to track)

[root@localhost ML01]# git add .

もう一度状態を確認
[root@localhost ML01]# git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   kabu/1data.txt
    new file:   kabu/1data_back.txt
    new file:   kabu/learnstock
    new file:   kabu/learnstock.c
    new file:   sum2/out/sum2.out
    new file:   sum2/src/a.out
    new file:   sum2/src/sum2
    new file:   sum2/src/sum2.c
    new file:   sum2/src/sum2.out


・コミット
git commit

コミットメッセージを記入できる



[root@localhost ML01]# git commit
[master (root-commit) 7083543]
(記入したコミットメッセージ)

 9 files changed, 203 insertions(+)
 create mode 100644 kabu/1data.txt
 create mode 100644 kabu/1data_back.txt
 create mode 100755 kabu/learnstock
 create mode 100644 kabu/learnstock.c
 create mode 100755 sum2/out/sum2.out
 create mode 100755 sum2/src/a.out
 create mode 100755 sum2/src/sum2
 create mode 100644 sum2/src/sum2.c
 create mode 100755 sum2/src/sum2.out



・状態の確認
stage、commitされていないディレクトリ、ファイルを確認できる(変更があるかを確認するとも言える。)

git status

変更点がある場合(例)
[root@localhost ML02]# git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   kabu/1data.txt
    new file:   kabu/1data_back.txt
    new file:   kabu/learnstock
    new file:   kabu/learnstock.c
    new file:   sum2/out/sum2.out
    new file:   sum2/src/a.out
    new file:   sum2/src/sum2
    new file:   sum2/src/sum2.c
    new file:   sum2/src/sum2.out

変更点が無い場合は下記のメッセージとなる。
[root@localhost ML01]# git status
On branch master
nothing to commit, working directory clean


・ファイルの削除

追加のコミットから、削除後のコミットまでの一連の流れ

[root@localhost ML01]# git commit
[master 152a019] test 削除テスト用のコミット(初め)
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
[root@localhost ML01]# git status
On branch master
nothing to commit, working directory clean
[root@localhost ML01]# git rm test.txt
rm 'test.txt'
[root@localhost ML01]# git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    test.txt

[root@localhost ML01]# git commit
[master 38e7b94] test
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt
[root@localhost ML01]# git status
On branch master
nothing to commit, working directory clean
[root@localhost ML01]#



・コミット履歴の閲覧
commit 38e7b94d09d62d2243a1b1db9b750bdfcfcc6b18
Author: sample <sample@sample.com>
Date:   Sun Jul 31 15:41:13 2016 +0900

    test
    
    削除テスト用のコミット(完了)

commit 152a01934e5de1fc8c80211048aba1476fe706dc
Author: sample <sample@sample.com>
Date:   Sun Jul 31 15:39:22 2016 +0900

    test
    削除テスト用のコミット(初め)

commit 86aff7042c15415f5260d4777632b3b03afb9cd1
Author: sample <sample@sample.com>
Date:   Sun Jul 31 15:02:14 2016 +0900

    READMEを追加

commit 7083543bb27ca1971040672043d4b7ac464ea7b7
Author: sample <sample@sample.com>


・作業のやり直し
コミットメッセージを書き直したい場合
git commit --amend

コミットした後に、何かのファイルをステージするのを忘れてしまった場合
 git commit -m 'initial commit'
 git add forgotten_file→ステージし忘れたファイル名
 git commit --amend

・stageしたファイルの取り消し
誤って「git add」で意図しないファイルをstageした場合。

git reset HEAD <file>...→駆除対象のファイル名


・ファイルへの変更の取り消し
 git checkout -- <ファイル名>


・リモートリポジトリの追加

git remote
URLを貼る必要があるから、hithubの使い方を知ってからにしよう。

以上です。






参考書籍
『機械学習と深層学習-C言語によるシミュレーション-』
(2016年/著者:小高知宏/発行人:村上和夫/発行所:株式会社オーム社)

前回の続きです。


今回は強化学習の1つ、Q学習(Q-learning)のプログラミングを数回に分けて見ていきます。

・強化学習(rainforcement larning)
一連の行動の最後に評価が与えられるような場合に用いる学習手法です。

教師あり学習との違いをゲームを元に説明します。

例えば将棋のゲームにおいてです。
教師学習による機械学習を試みた場合、プレイヤーの操作の一手一手ごと、
その操作を評価し、良否を教えます。

Q学習による機械学習を試みた場合、将棋の勝敗が決定した際に、
一連のプレイヤーの操作を評価し、その評価に基づいて学習をしていきます。

将棋の様な操作数が多い場合、1つ1つの操作を評価する為には
膨大なデータセットを用意する必要が出てきてしまいます。

Q学習では、プレイヤーの操作の結果を
「自分の勝ち、自分の負け、引き分け」の3パターンのみで見ています。
このパターンのうちのどれかに応じて評価地(報酬(reward))が与えられます。

この評価地を積み重ねることで学習していくのです。

・Q学習
学習対象となるのは、Q値(Q-value)と言う数値です。

Q値とはある場面において次に取るべき行動を選択する為の
指標となる数値の集合です。
次に選択すべき行動は、Q値によって選択することが出来ます。

Q学習が進み、Q値の値が改善されていくと、やがてさまざまな状態における
Q値による行動選択がより適切に行われるようになります。
一般の強化学習における行動選択の方針を政策(Policy)と呼びます。


Q学習では、適切なQ値を獲得することを学習の目的としています。
学習の初期においては、適切なQ値は不明であり、決めることができません。
その上で、Q値に従って行動を選択し更新していきます。


Q値更新の具体的な計算式は以下の通りです。

Q(s(t), a(t)) = Q(s(t), a(t)) + α(r + γmaxQ(s(t+1), a(t+1)) - Q(s(t), a(t))) 


・maxQ(s(t+1), a(t+1):次の時刻(t+1)において選択できる行動に対応するQ値のうちで最大値
・r:報酬(得られた場合のみ、得られなければ0)
・α:学習係数(0.1程度)
・γ:割引率(0.9程度)

学習係数αは、学習の速度を調節する定数です。

右辺の第2項では、報酬が得られた場合のみ加算される報酬値と、
次に選択できる行動に対応するQ値の最大値に比例する値を加算し、
元々のQ値との差分をとった値です。



Q学習に関する手続きをまとめると、次のようになります。
1.全てのQ値を乱数により初期化する
2.学習が十分進むまで以下を繰り返す
3.動作の初期状態に戻る
4.選択可能な行動から、Q値に基づいて次の行動を決定する
5.行動後、上記の式に従ってQ値を更新する(Q値の学習)
6.ある条件(目標状態、あるいは一定の時間経過)に至ったら、No.1に戻る
7.No.2に戻る

*式の計算処理
3-1:もし報酬が得られたら、報酬に比例した値をQ値に加える
3-2:次の状態に選択できる行動に対するQ値のうち、最大限に比例した値をQ値に加える。

続きは次回です。

今週気になったニュースについてです。


 参考記事
『外資コーヒー、タイで拡大 年25%成長観測 スタバは500店計画』(2016.7.29 SankeiBiz:http://www.sankei.com/economy/news/160310/ecn1603100030-n1.html)

比較的治安が良く観光地として有名なタイでは最近コーヒーチェーン市場が伸びてきているそうです。

インドなどではスターバックスをみたことがありますが、いわゆる発展途上国と呼ばれる国の中でも外資のコーヒーチェーンが勢力を伸ばしてきているみたいです。


タイと言えば旅行先としても非常に人気がある為、スターバックスがあれば外国人観光客が重宝するでしょう。
旅行客にとっても、現地の市民に対してもメリットが大きくなると考えられます。

ところで、東南アジアでコーヒーだと、ベトナム辺りが有名ですが、タイに輸入されたりはしているのでしょうか?
陸路によるアクセスも容易な為、多少は輸入され、販売されていることだとは思いますが、外資チェーン店が原材料に使うことは考えにくいです。

とすると、現地で独自にコーヒーショップを経営しているものは強烈な競争の場に身を置くことになります。

現地でわざわざスターバックスに行く必要はないと考えている人も居るかもしれない為、多少は需要があるかもしれませんが、独自のサービスを展開することが求められるでしょう。


面白いデータがひとつありました。
http://coffee.ajca.or.jp/data

コーヒーに関する統計資料などがまとめられています。
その中に世界の一人当たりコーヒーの消費量についてまとめられた資料があります。
http://coffee.ajca.or.jp/wp-content/uploads/2011/08/data09_2015-11.pdf

これをみると、輸出国というカテゴリーの中に東南アジアではインドネシア、ベトナムが名を連ねているのですが、1人当たりの1年間の消費量は2.0Kgを下回っています。(日本はおよそ3.4Kg)
ベトナムは若干上昇していますが、インドネシアに至っては全く上昇していません。

輸出用もしくは販売用の農産物としての意味合いが強いのでしょうか。
コーヒーを飲む文化が、同じ東南アジア圏でもやや差異がみられる様です。




参考書籍
『機械学習と深層学習-C言語によるシミュレーション-』
(2016年/著者:小高知宏/発行人:村上和夫/発行所:株式会社オーム社)

前回の続きです。


参考書籍の第2章では機械学習の基礎について実際の例題を用いて解説しています。

今日は帰納的学習についてです。
先に申し上げて起きますと、プログラムを組んで動作確認をしてみたのですが、正しく動作できたイマイチわからない状態です。

抽象的な概念から具体的な知識を導くような学習方法を「演繹的学習」と呼ぶのに対し、複数の事実からそれらを上手く説明出来るような知識を見出す学習のことを「機能的学習」と呼びます。
例としては、画像の認識や音声の聞き取りなどが挙げられます。
具体的事例データを学習データセットとして与えられることによって画像や音声を認識することが出来るのです。


より具体的な例として、株価の予想を行うプログラムを作ることにします。

とあるA社の株価は、関連企業のa~j社の株価の変動パターンによって決定されるとします。
a~j社の株価があるパターンを取った時A社の株価が上がり、別のパターンを取った時に株価が下がるという仕組みです。

過去の具体的な株価変動の事例を集めて帰納的な機械学習を行うことでパターンを抽出し、A社の株価を予測する知識を得るということです。
この為の方法として、「生成と検査(generate and test)」があります。

何らかの方法で問題の解候補となるパターンを生成し、学習データセットと照らし合わせることで良い解を選び出します。
解候補がデータセットといくつマッチングしているかによって得点で評価します。


a~j社の株価のパターンは左から順番に、株価の増減を1or0で表現します。ワイルドカードとして2を使用します。
各パターンに対してのA社の株価の増減も1or0で表現します。

この株価のパターンを学習データセットとして「1.data.txt」    を用意します。

[root@localhost kabu]# vim 1data.txt

1 0 0 0 0 0 1 0 0 1   1
0 1 0 1 0 1 1 1 0 1   1
0 1 0 0 0 1 1 0 1 0   0
1 0 0 1 1 0 1 0 0 1   1
1 0 0 1 1 0 1 1 1 1   0
0 0 0 0 0 0 1 1 0 0   1
1 1 1 1 0 0 1 1 0 1   0
0 1 1 1 0 1 1 1 0 1   0
0 0 1 1 0 1 1 1 0 0   0
1 1 1 0 0 0 0 1 1 0   0
0 0 1 1 1 0 0 0 1 0   0
1 0 0 0 1 0 1 0 1 1   0
・・・・・・・・・・・

学習データセットのファイル形式

左側の数字がa~j社の株価の増減パターンを示しています。
右側の数字は左のパターンを受けてのA社の株価の増減を示しています。
このパターンを100通り作成します。


実現する機械学習システムの処理は次のとおりです。

1.学習データセットの読み込み
2.No.3~7の処理を複数回繰り返す
3.乱数による解候補パターンを生成
4.以下を全ての学習データに対して繰り返す
5.解候補パターンを用いて、ひとつの学習データに対応するA社の株価の予想値を計算する
6.予想値を対応する教師データと比較し、合致していれば1点加算する
7.解候補パターンの評価値を(得点の合計)が過去の最高得点以上であれば、最高得点を更新する。



プログラムのモジュールの構成は以下の通りです。

・main()関数ー→readdata()関数・・・学習データの読み込み
       ↓
       ↓
       ↓→calcscore()関数・・・解候補パターンのスコアの計算    
       ↓
       ↓→rand012()関数・・・0,1,2を返す乱数関数

上記の構成でプログラムを組みます。

定数は以下の通りとなっています。
#define OK 1
#define NG 0
#define SETSIZE 100   /* 学習データセットの大きさ */
#define CNO 10        /* 学習データの桁数(10社分) */
#define GENMAX 10000  /* 解候補生成回数 */
#define SEED 32767    /* 乱数シード */

今回は具体的なプログラムについては割愛しますが、コンパイルをして実行ファイルを作成することで株価を予想する解パターンを得ることができます。

まずはパターンを指定しないで実行ファイルを起動させます。
[root@localhost kabu]# ./learnstock<1data.txt
2210100100:score=100

最良解
2210100100:score=100


あっという間に解候補のベストパターンが割り出されました。


次は、パターンの指定も行なってみます。
[root@localhost kabu]# ./learnstock<1data.txt                                   1 1 0 1 0 2 1 1 0 2 :score=65
2210100100:score=100

最良解
2210100100:score=100

指定したパターンはデータセットのうち、65/100パターンが引っかかったということになります。

ちなみに、
#define GENMAX 10000  /* 解候補生成回数 */
と記述していますが、

生成回数を少なくすることで、その回数の最良解を得られることが出来ます。
もっと多くの要素を使う場合、10000パターンで足りない場合はもっと回数を増やすことで最良解を得られやすくなります。

続きは次回です。



参考書籍
『機械学習と深層学習-C言語によるシミュレーション-』
(2016年/著者:小高知宏/発行人:村上和夫/発行所:株式会社オーム社)

前回の続きです。


前回は機械学習の分類をまとめましたがその続きです。

機械学習は学習の方法に基づく分類方法があります。

以下の3点に分類出来ます。

・教師あり学習
ある事例とそれに対する正解がペアで与えられて、学習項目の1つ1つについて指導者から教えを受ける様な学習

(ex)画像認識、音声認識

・教師なし学習
正解不正解を指導者に教えてもらうのではなく、与えられた学習データを機械学習システム自身が判断することで学ぶ学習

(ex)入力データ、自動分析

・強化学習
1つ1つの事項についての正解不正解は与えられないが、最後の結果評価のみが与えられる環境での学習

(ex)Q学習、DQN


教師あり学習は、ある事例とそれに対する正解がペアで与えられて、学習項目について指導者からの教えを受ける学習です。

教師なし学習は、与えられた学習データを機械学習システム自身が判断することで学んでいきます。
学習システム自身が自動的に機運を獲得しますが、その為には予め学習システム内部に何らかの原則が存在しなければなりません。


強化学習は、学習対象の個々の事例における正解不正解は教えられません。複数の事例に対応した出力を強化学習システムが答えると、最終的な判定として、それらの出力系列全体が良かったか悪かったかを知ることが出来ます。

最後の結果から、一連の操作が適切であったかどうかが分かります。


◎そのほかの学習法
群知能(Swarm Intelligence:SI)
生物の集団が見せる知的な行動をシミュレートすることで問題解決を図る手法


・粒子群最適化法(Particle Swarm Optimization, PSO)
魚や鳥などの生物の群れが、群れ全体として効率的に餌を見つける挙動を取ることをシミュレートした最適化手法

・蟻コロニー最適化法(Ant Colony Optimixstion, ACO)
蟻の群れが餌場と巣穴の間の最短経路を見つけることをシミュレートした最適化手法

・AFSA(Artifical Fish Swarm Optimization, AFO)


続きはまた次回

↑このページのトップヘ