Pyplot не отображает некоторые элементы массива данных - PullRequest
0 голосов
/ 22 сентября 2018

В одном из моих проектов я обучаю нейронные сети играть в игру.Чтобы увидеть их процесс, я делаю график с pyplot / matplotlib, показывая их лучшие и средние показатели пригодности.Большая часть этого работает, но по какой-то причине он не будет отображать некоторые данные из своего массива данных.Как я могу получить его для построения всех данных?

График даже не появляется в первый раз, когда запускается оператор print, хотя в массиве показателей есть один элемент.За вторым оператором печати следует график, показывающий только первый элемент массива, а за третьим оператором - график, показывающий первый и второй и т. Д.

Ниже приведен мой код, для простоты я удалилСетевая часть и просто используйте случайные целые числа для моделирования fitnessscores:

import numpy as np
import json
import matplotlib.pyplot as plt
import random

def graphFitnessScores(fileName):
    with open(fileName, "r") as file:
       alldata = [json.loads(line) for line in file.readlines()]
       plt.pause(0.001)
       plt.clf()
       bestFitnesPerGen = [alldata[i]["bestFitnesses"][0] for i in range(len(alldata))]
       print("generation %d, amountOfLinesInFile:%d, scores:%s" % (alldata[-1]["generationNumber"],len(alldata), bestFitnesPerGen))
       best, = plt.plot(bestFitnesPerGen, '-r.')
       averageBestPerGen = [sum(alldata[i]["bestFitnesses"])/len(alldata[i]["bestFitnesses"]) for i in range(len(alldata))]
       average, = plt.plot(averageBestPerGen, '-b.')

       plt.xlabel("number of the generation")
       plt.xticks(range(len(alldata)+1))
       plt.ylabel("Fitnessscore")
       plt.legend([best,average], ["Best of the generation", "Average of the generation"])
       plt.axis([0, len(alldata), 0, np.amax(bestFitnesPerGen)+10]) #[xMin,xMax,yMin,yMax]

def writeBestFitnessesToFile(fitnessScores, generationNumber):
    with open(str("mytestFile.txt"), 'a+') as file:
       dataAsString = '{"generationNumber" : %d, "bestFitnesses" : %s}\n' % (generationNumber, fitnessScores)
       file.write(dataAsString)



def startTraining(numberOfGenerations, generationSize):
   #.other code but irrelevant for question.
   testFitnesses = [random.randint(2,100) for i in range(generationSize)]
   scoredFitnesses = sorted(testFitnesses,reverse=True)
   writeBestFitnessesToFile(scoredFitnesses,0)
   graphFitnessScores(str("mytestFile.txt"))

   for i in range(1,numberOfGenerations+1):
      nextGeneration = initGeneration(i, generationSize)
   plt.show()


def initGeneration(generationNumber, generationSize):
   testFitnesses = [random.randint(2,100) for i in range(generationSize)]
   scoredNewGeneration = sorted(testFitnesses,reverse=True)
   writeBestFitnessesToFile(scoredNewGeneration,generationNumber)
   graphFitnessScores(str("mytestFile.txt"))

startTraining(3,100)

Я использую Python 3.6.4

Чтобы этот код работал правильно, пожалуйста, удалитесодержимое файла «myTestFile.txt» перед каждым выполнением.

оператор печати в graphFitnessScore печатает:

generation 0, amountOfLinesInFile:1, scores:[99]
generation 1, amountOfLinesInFile:2, scores:[99, 100]
generation 2, amountOfLinesInFile:3, scores:[99, 100, 100]
generation 3, amountOfLinesInFile:4, scores:[99, 100, 100, 98]

И файл «mytestFile.txt» выглядит так после окончательного оператора печати:

{"generationNumber" : 0, "bestFitnesses" : [99, 97, 96, 96, 94, 93, 93, 92, 92, 91, 91, 90, 89, 89, 88, 88, 86, 86, 85, 84, 84, 83, 83, 81, 80, 78, 78, 77, 77, 74, 72, 71, 70, 70, 67, 67, 67, 66, 65, 65, 64, 63, 63, 61, 59, 58, 58, 56, 56, 56, 56, 55, 55, 54, 52, 51, 50, 49, 48, 48, 46, 46, 46, 45, 43, 41, 41, 41, 41, 41, 40, 39, 39, 38, 38, 33, 32, 30, 27, 26, 24, 24, 20, 18, 17, 17, 15, 14, 13, 13, 10, 10, 10, 9, 9, 5, 5, 5, 2, 2]}
{"generationNumber" : 1, "bestFitnesses" : [100, 100, 100, 99, 99, 96, 95, 91, 90, 90, 90, 90, 90, 89, 89, 88, 88, 88, 87, 86, 86, 85, 85, 85, 85, 84, 84, 84, 83, 82, 82, 78, 78, 77, 74, 73, 73, 71, 68, 66, 65, 64, 63, 62, 62, 61, 60, 59, 59, 58, 57, 56, 55, 55, 54, 54, 53, 50, 47, 47, 47, 45, 43, 42, 41, 41, 41, 40, 39, 37, 36, 36, 35, 34, 32, 32, 32, 31, 30, 29, 28, 26, 23, 23, 21, 20, 20, 20, 18, 17, 17, 16, 14, 14, 14, 12, 12, 11, 5, 5]}
{"generationNumber" : 2, "bestFitnesses" : [100, 99, 97, 97, 97, 95, 94, 93, 90, 90, 90, 89, 89, 89, 89, 87, 86, 86, 83, 83, 82, 82, 79, 75, 75, 73, 72, 72, 71, 71, 70, 69, 69, 65, 64, 63, 62, 62, 61, 60, 59, 59, 58, 58, 58, 55, 53, 53, 52, 51, 49, 46, 45, 45, 45, 45, 45, 44, 44, 41, 41, 41, 40, 40, 39, 37, 36, 36, 36, 33, 32, 31, 28, 27, 26, 25, 22, 22, 22, 22, 19, 18, 17, 16, 16, 15, 13, 13, 12, 11, 8, 7, 7, 7, 5, 5, 3, 3, 2, 2]}
{"generationNumber" : 3, "bestFitnesses" : [98, 98, 97, 95, 95, 95, 92, 91, 90, 90, 90, 89, 89, 88, 88, 87, 86, 86, 85, 85, 84, 84, 83, 81, 81, 81, 80, 80, 78, 75, 73, 73, 72, 71, 71, 70, 69, 68, 66, 66, 65, 64, 64, 63, 63, 63, 63, 62, 61, 60, 59, 57, 57, 55, 55, 53, 51, 50, 49, 47, 46, 45, 44, 40, 40, 39, 39, 38, 35, 35, 34, 32, 28, 26, 25, 24, 24, 23, 22, 22, 19, 19, 19, 17, 15, 14, 14, 10, 9, 8, 7, 6, 6, 5, 4, 3, 3, 2, 2, 2]}

Но график никогда не отображает последний счет массива.Так что для последней итерации он показывает: enter image description here

1 Ответ

0 голосов
/ 23 сентября 2018

Причина, по которой ваш график неполон, заключается в том, что вы показываете сразу после последнего вызова функции (внутри startTraining -> initGeneration -> graphFitnessScores).

Поэтому решение состоит в том, чтобы добавить plt.pause(1) перед plt.show(), такчто все точки могут быть нанесены на график до того, как будет показана (последняя) фигура.Количество времени внутри pause, вероятно, должно быть больше, чем больше ваш набор данных (количество поколений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...