Использование matplotlib для построения средней кривой обучения агентов, играющих в tictactoe - PullRequest
1 голос
/ 17 июня 2020

Я написал агент Q-Learning, который играет ti c -ta c -t ie против случайного игрока. Я хочу сыграть в игру 20 раз и построить кривую среднего обучения с помощью matplotlib. Первый для l oop играет в игру двадцать раз и дает список numpy .ndarrays. Как мне получить средние награды за серию эпизодов, которые я могу построить в виде единой кривой? Вот что я сделал до сих пор:

lines = []

#play tictactoe 20 times
for i in range(0, 20):

    # Instantiate environment        
    environment = tictactoe.Tictactoe(verbose=True)

    # play the game which returns the rewards gained in a number of episodes
    line = play_tictactoe(environment,
                               player_o=player_o,
                               player_x=player_x,
                               episodes=m)
    #line is a numpy.ndarray
    #for example, the iteration of line could be 1,2,3,4,. The second 
    #could be 4,5,6,7. 
    lines.append(line)

for j in lines:
    avg_line = #calculate the single mean learning curve
               # I would want to plot 2.5, 3.5, 4.5, 5.5


ax2.plot(avg_line, color="red", label="Q-Agent")
ax2.set_title("The mean performance of 20 Q-Learning Agents")
ax2.set_xlabel('Episodes')
ax2.set_ylabel('Rewards')
plt.legend()
plt.show()

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вы можете вычислить среднее значение каждой строки и сохранить результат в списке, используя понимание списка, а затем построить среднюю линию

avg_line = [np.mean(j) for j in lines] # This is called list comprehension

x = np.arange(0, len(avg_line))
fig, (ax2) = plt.subplots(1,1)

ax2.plot(x, avg_line, color="red", label="Q-Agent")
0 голосов
/ 18 июня 2020

Если я правильно понимаю, lines выглядит так:

                |
                v   
[              t p
    [1,2,3,4], i l
    [5,6,7,8], m a
    [4,3,1,2], e y
    [5,6,7,8], s e
    [4,3,1,2],   d

]              
    -> episodes

, и вы хотите построить среднее значение по оси times_played и построить его в зависимости от индекса эпизода.

Вы можете сделать это с помощью

plt.plot(np.mean(lines, axis=0))
...