Epsilon-Greedy 법으로 만족도가 높은 레스토랑을 찾는 방법을 생각해 보았습니다.
목적
모델
평소 외식에서 이용하는 레스토랑의 탐색과 활용 비율은 Epsilon-Greedy법의 $\epsilon$ 에 해당하는 파라미터로 이번 [0.0, 0.1, 0.2, 0.3, 0.8] (0% or 10% or 20% or 30% or 80%)의 비율에 대해 결과를 확인했습니다.
결과
평상시의 외식으로 이용하는 레스토랑의 탐색과 활용의 비율로서 좋은 분으로부터 차례로 10% > 20% > 30% > 80% > 0% 라고 하는 결과가 되었습니다.
코드
ChoiceRestaurant 클래스 (상기 간이 모델 포함)
import random
import numpy as np
class ChoiceRestaurant():
def __init__(self, online_reviews, max_episode_steps=30):
self.online_reviews = online_reviews
self.max_episode_steps = max_episode_steps
self.toss_count = 0
def __len__(self):
return len(self.online_reviews)
def reset(self):
self.toss_count = 0
def step(self, action):
final = self.max_episode_steps - 1
if self.toss_count > final:
raise Exception("The step count exceeded maximum. Please reset env.")
else:
done = True if self.toss_count == final else False
if action >= len(self.online_reviews):
raise Exception("The No.{} restaurant doesn't exitst.".format(action))
else:
average_online_reviews = sum(self.online_reviews)/len(self.online_reviews)
online_review = self.online_reviews[action]
sigma = 0.5
if average_online_reviews < random.gauss(online_review, sigma):
reward = 1.0
else:
reward = 0.0
self.toss_count += 1
return reward, done
Epsilon-Greedy 방법의 계산 실행 클래스
class EpsilonGreedyAgent():
def __init__(self, epsilon):
self.epsilon = epsilon
self.V = []
def policy(self):
restaurants = range(len(self.V))
if random.random() < self.epsilon:
return random.choice(restaurants)
else:
return np.argmax(self.V)
def play(self, env):
# Initialize estimation.
N = [0] * len(env)
self.V = [0] * len(env)
env.reset()
done = False
rewards = []
while not done:
selected_restaurant = self.policy()
reward, done = env.step(selected_restaurant)
rewards.append(reward)
n = N[selected_restaurant]
restaurant_average = self.V[selected_restaurant]
new_average = (restaurant_average * n + reward) / (n+1)
N[selected_restaurant] += 1
self.V[selected_restaurant] = new_average
return rewards
구체적인 평가 리뷰/epsilon 값을 넣어 계산 실행 그래프 그리기
if __name__ == "__main__":
import pandas as pd
import matplotlib.pyplot as plt
def main():
env = ChoiceRestaurant([2.8, 4.1, 3.5, 4.1, 3.7, 3.9, 3.6, 3.4, 4.0, 3.6])
epsilons = [0.0, 0.1, 0.2, 0.3, 0.8]
game_steps = list(range(10, 3010, 10))
result = {}
for e in epsilons:
agent = EpsilonGreedyAgent(epsilon=e)
means = []
for s in game_steps:
env.max_episode_steps = s
rewards = agent.play(env)
means.append(np.mean(rewards))
result["epsilon={}".format(e)] = means
result["restaurant choice count"] = game_steps
result = pd.DataFrame(result)
result.set_index("restaurant choice count", drop=True, inplace=True)
result.plot.line(figsize=(10,5))
plt.show()
main()
참고
Epsilon-Greedy 방법의 샘플 코드
Reference
이 문제에 관하여(Epsilon-Greedy 법으로 만족도가 높은 레스토랑을 찾는 방법을 생각해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/knyrc/items/71d9d7fb6a245beb0c5c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)