Server

配牌からアガれるかアガれないか予測する

投稿日:2017年3月14日 更新日:

はじめに

趣旨

こんにちは、最近個人的な勉強としてディープラーニングを始めたtonnyです。
手始めに、O’Reilly Japanさんから出版されているゼロから作るDeep Learningを読みました。
しかし、私自身に知識がなく、いまいちピンとこなかったので、簡単なものを作ってみようと考えました。

とはいえ、せっかくなら自分の趣味でもある麻雀に関わるところで作ろうと考えました。

(以前Qiitaにも同じ記事を投稿しましたが、こちらにも投稿します。)

筆者のスペック

  • Python、機械学習ともに初心者
  • 普段はPHPやRubyを使ったWebのお仕事

環境

  • Python 3.6.0
  • bottle 0.12.13
  • heroku

機能概要

作成したアプリは下記になります。
https://python-mahjang.herokuapp.com/index

また、ソースコードは下記になります。
https://github.com/naoki85/python_mahjong

  • 配牌と結果のみを学習対象としました。
  • 配牌を下図のように、かたちで分解し、それぞれの重みから「アガれる」か「アガれない」か出力します。
  • あくまで「アガリ」という結果のみなので、役にはこだわっていません。

実装に関して

教師データ

教師データはYoutubeなどでプロの対局を見て、配牌と結果を収集しました。
数としては100いっていないため、これは継続して収集します。

前処理

配牌を以下の3つのノードに分解しています。

  • 順子の数(階段並び)
  • 対子の数(同じ牌が2枚)
  • 暗刻の数(同じ牌が3枚)

各ノードの重みの学習

各ノードの重みはゼロから作るDeep Learningを参考に、勾配法で推定しています。

実際に使ってみた

Youtubeにあがっていたとあるネット麻雀の動画で試してみました。

局 結果 あがれる確率 あがれない確率
東1局 あがれない 17% 83%
東2局 あがれない 29% 71%
東3局 あがれない 7% 93%
東3局1本場 あがれない 17% 83%
東4局 あがれない 33% 67%
南1局 あがれる 20% 80%
南1局1本場 あがれない 26% 74%
南2局 あがれない 17% 83%
南3局 あがれる 26% 74%
南4局 あがれる 23% 77%

パッと見、ちゃんと予測できているようには見えないです。
よく考えたら、麻雀は4人のうち1人があがれるゲームなので、単純計算でアガれる確率は25%です。
教師データが足りないのかもしれないと思い、とりあえずプロの対局1局分追加してみました。

再テスト

同じ動画で再度試してみました。
アガれない結果のみを比較してみます。

局 結果 あがれる確率 あがれない確率
東1局 あがれない 83% 73%
東2局 あがれない 71% 64%
東3局 あがれない 93% 92%
東3局1本場 あがれない 83% 80%
東4局 あがれない 67% 72%
南1局 あがれる 80% 85%
南1局1本場 あがれない 74% 79%
南2局 あがれない 83% 80%
南3局 あがれる 74% 79%
南4局 あがれる 77% 73%

 

10局のうち、6局の「アガれない確率」が下がっています。

やはり、教師データを増やせば結果は変わってくるようです。

学習させた結果から

学習させた重みパラメータは下記になります。
第1要素がアガリへの寄与、第2要素がアガれない方への寄与になります。

この結果を見ると、順子、対子はアガリに寄与していますが、暗刻は逆にアガリに寄与していないようです。
暗刻があると手が狭くなるからでしょうか?

バイアスパラメータは下記になります。
すでにアガれない方のバイアスが高すぎます。

さいごに

課題

現在は下記の2点を課題としてあげて勉強しようと思っています。

  1. 教師データを増やす
  2. レイヤーのノードを追加(リャンメン、カンチャン、ペンチャン)の数

今回このWebアプリを作ったのは、教師データを増やす上で入力を楽にしたいためです。
その過程でPythonの軽量FWであるbottleについて学べて良かったと思っています。

やってみての感想

ディープラーニングも学習したてで、何をして良いのかもよく分かっておりません。
(そもそも麻雀という不確定要素の塊を題材にすること自体ナンセンスなのかもしれませんが。。。)

そのため、ご指摘やそもそも間違っているなどのご指導ありましたらコメントをください!
(アドバイスなどもいただけると嬉しく思います。)

blog-page_footer_336




blog-page_footer_336




-Server
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA


関連記事

aws

ECSとCWLでのアラームの設定

はじめに ECS上のタスクで特定の文字列をログに出力した際にCloudWatch Logsでアラームとして表示する方法を紹介します。 全体の流れ やることは以下の通りです。 CloudWatch Lo ...

DockerでLAMP環境をつくり、LimeSurveyを動かしてみた

はじめに LAMPのローカル環境構築には便利なツールがたくさんあります。 MacだったらMAMP、WindowsならWAMPなどが有名でしょうか? 今回、調査のためにLimeSurveyを使用すること ...

WordPressとRailsアプリケーションを相乗りさせた時の話

  はじめに 先日、現在開発中のアプリケーションのステージング環境の構築を行ないました。 ステージング環境はこのブログのサーバと相乗りさせています。 今回はその際に行ったNginxの設定とS ...

Docker上でTensorFlowのチュートリアルをやってみた

はじめに こんにちは、最近個人的な勉強でPython、ディープラーニングをやっているtonnyです。 以前も自分で作ってみた配牌からアガれるかアガれないか予測する記事を書かせていただきました。 今更 ...

Python(bottle)をApacheで動かす

はじめに 以前、「配牌からアガれるかアガれないか予測する」を公開しました、tonnyです。 最近はもう少しスケールダウンさせて、何切る問題でディープラーニングを利用してみようと思っています。 データを ...

フォロー

blog-page_side_responsive

2017年3月
日 月 火 水 木 金 土
 1234
567891011
12131415161718
19202122232425
262728293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。