02_bandit_algorithm_compare.ipynbでも,np.random.rand() < actual_cvr[selected_arm]の部分は予定調和になってしまわないでしょうか?
success_countsに入るかどうかはそれを決定する直前に決まっていますから,選んだarmが毎回randomにnp.random.rand() > actual_cvr[selected_arm]になってしまい, 全く学習にはなりえません.
print(select_arms.count(0), select_arms.count(1), select_arms.count(2))
上のcodeを追加した結果がこれです.
3335 3290 3375 <== random
4422 4149 1429 <== baysian_ucb
3881 3582 2537
3459 3763 2778
5624 2851 1525
6684 1867 1449
Random 0.1115
Baysian_UCB 0.116
UCB1 0.1144
Softmax 0.1164
Softmax_annealing 0.1198
Thompson_sampling 0.1162
3261 3368 3371 <==以下同様.
8046 505 1449
4170 2559 3271
4014 2988 2998
7325 883 1792
5511 2306 2183
Random 0.1067
Baysian_UCB 0.1153
UCB1 0.1103
Softmax 0.113
Softmax_annealing 0.1184
Thompson_sampling 0.1134
3369 3339 3292
7681 1799 520
4018 3159 2823
3800 3378 2822
6552 2883 565
6814 2124 1062
Random 0.1099
Baysian_UCB 0.118
UCB1 0.1108
Softmax 0.1117
Softmax_annealing 0.1152
Thompson_sampling 0.1158
3318 3309 3373
7098 2379 523
3774 3740 2486
3281 3726 2993
3111 4970 1919
7434 1470 1096
Random 0.1118
Baysian_UCB 0.116
UCB1 0.1116
Softmax 0.112
Softmax_annealing 0.1126
Thompson_sampling 0.1128
以上の様にBaysian_UCBは1番が選ばれる確率が高いにも関わらず,scoreは低い値になっているのはrandomにnp.random.rand() > actual_cvr[selected_arm]が起きていることが原因です.
ベンチマークとしては崩壊した実装になっています.
改良してもらえるでしょうか?