Возможно ли получить алгоритм attribute.eaSimple, чтобы он возвращал журнал, включающий все статистические данные за время выполнения? - PullRequest
1 голос
/ 03 ноября 2019

Я хочу иметь возможность получить всю мою статистику из журнала, чтобы я мог использовать ее для графического представления. В нынешнем виде мой бортовой журнал содержит только номера поколений и количество оценок. Алгоритм вычисляет и выводит avg, std, min и max, но они не возвращаются, поэтому я не могу их использовать. Есть ли способ, которым я могу получить эти значения из моего алгоритма?

Я попытался просмотреть документацию для создания записей, но что там либо не имеет смысла для меня, либо относится к моей ситуации.

def main():
    pop = toolbox.population(n=300)
    hof = tools.HallOfFame(1)

    stats_fit = tools.Statistics(lambda ind: ind.fitness.values)
    stats_size = tools.Statistics(len)
    mstats = tools.MultiStatistics(fitness=stats_fit, size=stats_size)

    # my hope is that the values calculated by these functions show up in my logbook
    mstats.register("avg", numpy.mean)
    mstats.register("std", numpy.std)
    mstats.register("min", numpy.min)
    mstats.register("max", numpy.max)

    pop, log = algorithms.eaSimple(pop, toolbox, 0.5, 0.1, 200, stats=mstats,
                                   halloffame=hof, verbose=True)

    print(str(log[0]))  # only outputs generations, number of evaluations

мой вывод из этого выглядит следующим образом (заметьте, я исключил вывод из алгоритма, который имел отношение к размеру дерева, так как я не думал, что это было необходимо, и загромождал вывод, но это делаетвывод этих данных)

gen nevals  avg     gen max     min     
0   300     1125.92 0   45318.7 83.1079
1   173     1031.65 1   33883.4 83.1079
2   163     779.317 2   1888.68 83.1079
3   149     901.061 3   33606.2 82.4655
4   165     686.407 4   33883.4 81.8855
5   177     962.785 5   33757   81.8855
6   184     1632.86 6   33885.7 81.8855
7   171     1509.72 7   33856.9 81.8855
8   182     984.048 8   33732.6 81.6701
9   177     1534.63 9   34009.9 81.3255
10  159     1277.39 10  33885.7 80.9722 
{'gen': 0, 'nevals': 300}

Я ожидаю, что последняя строка должна включать в себя все остальное в журнале

РЕДАКТИРОВАТЬ:

копать глубже Я обнаружил, что это может бытьошибка. В документации говорится, что она должна регистрироваться, когда сюда включена статистика https://deap.readthedocs.io/en/master/api/algo.html

она гласит: «Возвращает оптимизированную совокупность и журнал со статистикой развития. Журнал будет содержать номер поколения,количество оценок для каждого поколения и статистика, если в качестве аргумента указана статистика. "

Я включил статистику, но, похоже, она не работает.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Когда вы используете несколько статистических данных, вы должны указать главу журнала, к которой вы хотите получить доступ. В вашем примере статистика состоит из двух глав: fitness и size. Следовательно, последняя строка в вашем примере должна быть

print(log.chapters['fitness'][0])
print(log.chapters['size'][0])

, которая будет выводить

{'avg': 0.5061951303359752,
 'std': 0.12547520913281693,
 'min': 0.15187521062437034,
 'max': 0.9576681760851814,
 'gen': 0,
 'nevals': 300}
{'avg': 5.0, 'std': 0.0, 'min': 5, 'max': 5, 'gen': 0, 'nevals': 300}
0 голосов
/ 03 ноября 2019

Я обнаружил проблему, которая, кажется, была вызвана тем, что я использовал MultiStatistics. Я вернулся к нормальной статистике, и она работала нормально

def main():
    pop = toolbox.population(n=300)
    hof = tools.HallOfFame(1)

    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg", numpy.mean)
    stats.register("std", numpy.std)
    stats.register("min", numpy.min)
    stats.register("max", numpy.max)

    pop, log = algorithms.eaSimple(pop, toolbox, 0.5, 0.1, 40, stats,
                                   halloffame=hof, verbose=True)
    print(str(log[0]))
...