ただのメモ

他の人に見せても良い方のメモ

ε貪欲法

せっかく理解するなら、日本語だけではなく、コードで理解したいので、書いた。

  • 試しに、単純なε貪欲法で試してみる。
  • import math
    import random
    import numpy as np
    def normal(musigma):
      return np.random.normal(mu, sigma)
      #return 1/(math.sqrt(2 * math.pi) * sigma) * math.exp(- (x - mu)**2 / (sigma ** 2))


    def action(i):
      mean = [0, 0, 1, 1, 2]
      variance = [1, 2, 1, 3, 0.5]
      return normal(mean[i], variance[i])


    def Epsilon_Greedy(epsilon):
      T = int(input())
      K = 5
      first = int(epsilon * T / K)
      best_score = - 10**10
      best_action = 10**10
      cumultive_score = 0
      for i in range(K):
        score = 0
        for j in range(first):
          score += action(i)
        cumultive_score += score
        if score >= best_score:
          best_score = score
          best_action = i
      for i in range(T - first * K):
        cumultive_score += action(best_action)
      return (best_action,cumultive_score)
    Epsilon_Greedy(0.1)
    T = 10000
    bset_action = 4, cumultive_score = 18805.99011057487
  • 実際にしたら、平均の最も良い行動は4(左から5番目の平均2の報酬のやつ)なので、正解である。
  • ここで、 \epsilonの値を0から0.99まで変えてみて、累積報酬の挙動を調べる。ただし、 T = 10000で固定した。
  • from matplotlib import pyplot as plt

    x = [0.01 * i for i in range(100)]
    y = [Epsilon_Greedy(0.01 * i)[1] for i in range(100) ]

    plt.plot(x,y)
  • f:id:medical-science:20211016180838p:plain

    すると、線形(に近い)グラフが出来る。これは、 \epsilonが大きいほど、平等に引いてる割合が大きいので、累積報酬の期待値は、全報酬の期待値×探索回数+最大報酬の期待値×搾取回数、であり、探索回数と搾取回数はεの一次式なので、全体もεの一次式となる。
  • さらに、注目すべきは、 \epsilonが大きいほど、分散が大きいように見える。これは、問題設定に強く依存するので、なんとも言えない。

バイバイ!