強化学習
強化学習の簡単な例題として、探索と利益のトレードオフを考慮したマルチアームバンディット問題を考えてみましょう。
以下に、サンプルデータを作成し、そのデータを元に最適化問題を解く方法を示します。
サンプルデータ:
- アーム1: 平均報酬1.5
- アーム2: 平均報酬2.0
- アーム3: 平均報酬1.8
- アーム4: 平均報酬1.2
- アーム5: 平均報酬1.7
また、最大の試行回数は100回とします。
以下が、CVXPYを使用してこの最適化問題を解くコード例です。
1 | import cvxpy as cp |
上記のコードでは、cvxpy
ライブラリを使用して最適化問題を定義しています。
目的関数は、選択したアームの平均報酬の総和を最大化するように設定されています。
制約条件として、1つのアームを選択することや非負制約を指定しています。
最適化問題を解くと、最適なアームの選択が得られます。
これをグラフ化することで、各アームの平均報酬を視覚的に理解することができます。
棒グラフでアームの番号に対応する平均報酬が表示されます。
[実行結果]
ソースコード解説
コードの各部分の説明をします。
1. import
文:
cvxpy
モジュールをcp
という別名でインポートしています。
CVXPYは凸最適化問題を解くためのPythonライブラリです。numpy
モジュールをnp
という別名でインポートしています。
NumPyは数値計算のためのPythonライブラリです。matplotlib.pyplot
モジュールをplt
という別名でインポートしています。
Matplotlibはデータの可視化のためのPythonライブラリです。
2. データの定義:
arm_means
は各アームの平均報酬を格納するリストです。
例えば、[1.5, 2.0, 1.8, 1.2, 1.7]
というリストは、5つのアームの平均報酬がそれぞれ1.5, 2.0, 1.8, 1.2, 1.7であることを示しています。max_trials
は最大の試行回数を表しています。
3. 変数の定義:
x
はアームの選択を表すバイナリ変数です。
各要素が0または1の値を持ちます。
この変数を使ってアームの選択を最適化します。
4. 制約条件の定義:
constraints
は最適化問題の制約条件を表すリストです。
ここでは、1つのアームを選択する制約(cp.sum(x) == 1
)と非負制約(x >= 0
)を設定しています。
5. 目的関数の定義:
objective
は最適化問題の目的関数を表すオブジェクトです。
この場合、アームの平均報酬とアームの選択を乗算し、その総和を最大化するように設定しています。
6. 最適化問題の定義:
problem
は最適化問題を表すオブジェクトです。
目的関数と制約条件を指定しています。
7. 最適化の実行:
optimal_value = problem.solve()
で最適化問題を解いています。
最適化の結果、最適なアームの選択と最適な報酬の総和が得られます。
8. 最適なアームの選択を取得:
arm_selection
は最適なアームの選択を示す変数です。
アームの選択が1の要素のインデックスを取得しています。
9. グラフ化:
arms
はアームの番号を表すリストです。rewards
は各アームの平均報酬を格納したリストです。plt.bar()
関数を使用してアームの番号に対応する平均報酬を棒グラフで表示しています。plt.xlabel()
、plt.ylabel()
、plt.title()
で軸ラベルやタイトルを設定しています。plt.show()
でグラフを表示します。
このコードの結果は、アームの平均報酬を棒グラフとして表示します。
最適なアームの選択結果と平均報酬が視覚化されます。