Hatena::ブログ(Diary)

小人さんの妄想 このページをアンテナに追加 RSSフィード Twitter

2016-01-06

機械学習.vs.乱数

新年おめでとうございます。久しぶりにブログを更新します。どっこい生きてます。

昨年は、たった1回しか更新しませんでした。

今年はブログを書けるくらいのゆとりを持ちたいものです。


さて、昨年までを振り返ると、一部で「サザエさんじゃんけん予想」が話題になったことがありました。

なんでも8割以上の的中率を叩き出した方もおられるとか。

そこまでするには相当の入れ込みが必要でしょうが、ちょっとパソコンで試すだけなら、わりと手軽にできます。

予想の方法はいろいろありますが、私は以下のブログを参考に、scikit-learnという機械学習を試してみました。


* サザエさんのジャンケンの次の手を決定木で予測+可視化してみた

>> http://sucrose.hatenablog.com/entry/2014/11/23/230622

やったことは、上のブログにある通りです。

・パソコン上に Python と scikit-learn を用意する。

・過去のじゃんけんデータを入手する。

・あるじゃんけんの手に対して、過去3回がどんな手だったのかをまとめる。

 例えば、2015/12/20にパーが出たら、その1回前はパー、2回前はグー、3回前はチョキ、

 といった具合に過去3回の手を一覧表(配列)にまとめる。

・「決定木」を使って予測を行う。

 20分割のクロスバリデーション(データの19/20で学習して残りの1/20で評価するのを20回繰り返す)で正解率を評価する。

 決定木の深さを1〜6まで変えて、正解率を調べる。

データは、こちらのサイトから入手しました。

* サザエさんじゃんけん学 >> http://www.asahi-net.or.jp/~tk7m-ari/

「過去の手一覧」ページからじゃんけんデータを取得できます。

(なお、このページには「第7回 91.11.31」という日付の間違いがありました。)


決定木、深さ2の学習結果は、こうなりました。

f:id:rikunora:20160106153603p:image

深さに応じた正解率は、次の通りでした。

深さ正解率
143.1%
244.5%
353.1%
452.2%
550.2%
650.1%

正解率50%ってことは、半分しか当たらないではないか・・・

いやいや、もし何も考えずに手を出したなら 1/3 しか当たらないはずなので、

半分当たるってことは、実はすごいことなのです。


で、ここまできて、ふと疑問が湧いてきました。

全くのランダムを相手に機械学習したなら、正解率はどうがんばっても 1/3 になるはずではないかと。

そこで、サザエさんの代わりに Python組み込みの乱数(random)を相手に機械学習してみたところ、

正解率は予想通り、ほぼ 1/3 となりました。


では、全くの乱数ではなく、円周率を相手にしたらどうなるか。

円周率 3.1415...を3進法に変換し、0=グー、1=チョキ、2=パー、として機械学習させたところ、

正解率はやっぱり 1/3 程度でした。

サザエさんデータが1215件だったので、円周率も同程度の1200件としました。以下、データサイズは全て1200件です。)

円周率には何らかの規則があるだろうと思うのですが、「過去3手を調べる」という方法は通用しないようです。


では、円周率よりもう少し規則性がありそうな数、たとえば√2 = 1.4142...では、どうなるか。

結果は、やはり 1/3 程度。

過去3手を見る限り、円周率も√2も、乱数とほとんど見分けがつきません。


無理数はあきらめて、もう少し規則性がありそうなデータは無いものか。

たとえば文章に出てくる文字列には、何らかの規則性がありそうです。

そこで、Wikipedia の英語版「Randomness」のパラグラフを取り出して、

アルファベット26文字を26進数と見なし、これを3進数に変換しました。

(大文字、小文字は区別せず、, . などの記号は無視しました。)

この英文3進数を機械学習させたところ、結果はやはり 1/3 程度でした。

期待外れです。英文であっても、3進法に変換すると、十分ランダムなようです。


意地でも規則性を見つけたいので、今度はアルファベットの並びを3で割った余りを対戦相手としました。

A=グー、B=チョキ、C=パー、D=グー、E=チョキ、F=パー、... といった具合です。

その結果、正解率は約40%程度となりました。

英語文字列は、そのままの形であれば、ようやく規則性が見えてくる、ということでしょうか。


最後に、自分の手ででたらめに 0,1,2 を並べたデータを作成して、機械学習させてみました。

すると、約60%程度もの正解率となりました。

自分では全くでたらめに打ったつもりでも、実はサザエさん以上のクセが付いていたのです。

f:id:rikunora:20160106153604p:image

規則性がある方から順に並べると、

 手打ちデータ > サザエさん > 英文(単純な余り) > √2 >= 円周率 >= 乱数 >= 英文(3進法)

ということで、

 教訓:「サルがでたらめにキーボードを叩いても、乱数にはならない。」


スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/rikunora/20160106/p1