ここでは強化学習の一例で作成した、コイントスの結果を予測するプログラムの解説を行います。
ssp はコインの性質、asp はプログラムの賭け方
簡易版でもご説明した通りsspでは80%の確率で表、20%の確率で裏というこのコインの性質を定義しています。「1」が表、「0」を裏として、この数列からランダムに数字を一つ取り出すと4/5の確率(80%)で「1」=表がでます。
この数列はプログラムがどのように賭けるかを定義しています。この数列からランダムに数字を一つ取り出すと「1」=表に賭ける確率も「0」=裏に賭ける確率も同じく50%ずつです。今回行った強化学習ではこの数列(賭け方)をコインの特性に合わせて進化させました。
for構文でコイントスの結果予想を100回実行!
ここで、
a = np.random.choice(asp)はコイントスの結果の予想です。
s = np.random.choice(ssp)は実際の結果です。
このプログラム文を和訳すると下記のようになります。
ここで大事なのは「結果」をaspに記録したという点です。
.append()は数列にかっこの中身を足してください、という意味です。例えば一回コインを投げて「1」=表が出たらaspという数列はどうなるでしょうか?
「1」を数列に足すのでasp = [1, 0, 1]となります。この新しい数列で結果を予想するとどうなるでしょう?
今度は2/3の確率で「1」=表と予想してくれることがお分かりになりますでしょうか。
コイントスの回数が増えると、aspの数列もだんだん増えてきて精度の高い予想ができるようになります。
この結果、報酬が最大化できたわけですね!!
【Let's play around with the numbers and Codes!】
プログラムがどのように動いているかを理解する上で一番大事なのは変数やパラメーターを変えて遊んでみることです。
今回はプログラムが学習してだんだん予想の精度が上がるようにしましたがもしこれを学習せずにただ1/2の予想を繰り返すだけにしたらどんな結果になっていたでしょうか?
せっかくなのでやってみましょう!やり方は簡単、コードの12行目をコメントアウトするだけです。
動きましたか?だいたい50を中心とした数字が報酬の平均としてアウトプットされたのではないでしょうか。
期待値の話をすると、もし表裏の選択が50%ずつのまま予想し続けると、
表に賭けて当たる確率 = 4/5×1/2 = 4/10
裏に賭けて当たる確率 = 1/5×1/2 = 1/10
当たる確率 = 4/10 + 1/10 = 1/2
ということで、コインが特殊だろうが何だろうが50%の確率で当たることがわかります。
その一方で、もし今回のプログラムのようにコインの特殊性を看破して80%の確率で表、20%の確率で裏に賭けるようにしたら当たる確率は変わるでしょうか?
表に賭けて当たる確率 = 4/5×4/5 = 16/25
裏に賭けて当たる確率 = 1/5×1/5 = 1/25
当たる確率 = 16/25 + 1/25 = 17/25 = 0.68
御覧のように的中する確率が先ほどに比べて36%増加しました!
このようにプログラミングの力でその時々に応じて状況を把握し、正しい決断を行っていくことができます。金融市場でも応用できそうですよね!
今回使用したコードは以下からコピペしてお使いください。