是否有可能获得 algorithm.eaSimple 到 return 的日志,其中包含 运行 时间的所有统计数据?
Is it possible to get algorithm.eaSimple to return a logbook that includes all stats from run time?
我希望能够从日志中获取我的所有统计数据,以便我可以将其用于图形表示。就目前而言,我的日志仅包含世代编号和评估次数。该算法正在计算和输出 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
它显示为 "It returns the optimized population and a Logbook with the statistics of the evolution. The logbook will contain the generation number, the number of evaluations for each generation and the statistics if a Statistics is given as argument."
我已经包含了统计信息,但它似乎不起作用。
我发现了这个问题,这似乎是我使用 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]))
当您使用多个统计信息时,您必须指定要访问的日志章节。在您的示例中,统计信息有两章: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}
我希望能够从日志中获取我的所有统计数据,以便我可以将其用于图形表示。就目前而言,我的日志仅包含世代编号和评估次数。该算法正在计算和输出 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
它显示为 "It returns the optimized population and a Logbook with the statistics of the evolution. The logbook will contain the generation number, the number of evaluations for each generation and the statistics if a Statistics is given as argument."
我已经包含了统计信息,但它似乎不起作用。
我发现了这个问题,这似乎是我使用 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]))
当您使用多个统计信息时,您必须指定要访问的日志章节。在您的示例中,统计信息有两章: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}