このエントリーをはてなブックマークに追加

2017年1月16日月曜日

配牌からあがれる可能性を予測する!(その1 推論処理)


2017.01.21 更新
その2を公開しました!
https://nowdeveloping.blogspot.jp/2017/01/blog-post_21.html

こんにちは、Taroです。
日増しに寒くなってきましたね。
今年もセンター試験は大寒波とかニュースでやっていましたが、毎年そうなのでタイミングが悪いんですかね?

ゼロから作るDeep Learningを読んでいます


最近、趣味かつ独学ではありますが、Deep Learningの勉強をしています。
ゼロから作るDeep Learning」は初心者でも分かりやすい本だと思います。
(知識がない私でも頑張ってなんとかついていっています笑)

しかし、(私自身に知識がないためだとは思いますが)いまいちピンときません。
ピンとこないというのは、意味が分からないということではなく、「実際にこれをどうやって使うんだろう」というところです。

あれこれ悩んだ結果、簡単なネットワークを自分で作ってみようと思いつきました。
せっかくなら自分の興味のある麻雀をベースに、
配牌を入力して、あがれるかあがれないか予測する
モデルを作ってみたいと思います。

ソースコードも公開していきますが、Deep LearningどころかPythonも初心者なので、ぜひご指導をお願いしますm(_ _)m
麻雀は知らないけど、Deep Learningとか興味ある、という方でも読んでいただけるようにしていきます。

とりあえず設計


配牌(はじめに配られる手札のようなもの)から、アガリの確率を求めるために必要なファクターは何か、真剣に考えてみました(それはもう、プログラムを書いているとき以上に)。
また、あまりに複雑すぎるファクターだと私が実装できない可能性があり、かつ本筋を見失いかねないので、以下の3つの要素としました。
  1. 配牌時に存在する順子の数
  2. 配牌時に存在する対子の数
  3. 配牌時に存在する暗刻の数
麻雀が分からない方は、トランプで7、8、9と階段で持っているか、7、7、7と同じ数字を複数枚持っているか、どちらがアガリやすいかという風に考えてください。

これら3つの要素を算出し、それぞれに対して重み(W)を掛けて、最終的な総和からアガれるかアガれないか予測します。
ちょっと私の説明が下手なきらいもあるので、図にしたいと思います。



データの扱い

例えば、下記のような配牌があります(一番右の牌は無視してください笑)。
このときの入力値はリスト型で、
input_data = [14, 15, 19, 23, 25, 25, 32, 37, 39, 39, 43, 43, 47]
と渡します。
順子の数は0、対子の数が3つ、暗刻の数が0です。
そのため、
X1 = 0
X2 = 3
X3 = 0
とします。
ここで、それぞれに対して重みWを掛けます。
重みは、それぞれのファクターがどれだけ寄与しているか示す値です。
この重みを今後学習させて、最適な値を探していきます。
今回は適当な値を渡しておきます。

そして、最後にそれらを足し合わせて結論を導きます。
結論を導く際に、バイアスで閾値を設定しますが、こちらも今後の学習で値を決めていくので、今回は適当な値を入れます。
最終的には下記のように出力させたいと思います。
result = [0.50407631, 0.49592369]
第一要素がアガれる確率、第二要素がアガれない確率と考えます。
今回は適当な値を入れたので、フィフティフィフティみたいな中途半端なことになっておりますが、今後の学習で立派な予想屋になってもらいます!

次回は、学習を実装していきたいと思います。
できれば完成までお付き合いください!

最後に、ソースコードはこちらになりますので、よろしければご覧ください。
https://github.com/naoki85/python_mahjong
2017.01.21 更新
その2を公開しました!
https://nowdeveloping.blogspot.jp/2017/01/blog-post_21.html

0 件のコメント:

コメントを投稿