Jol*_*onB 2 python machine-learning deap
我正在学习使用 Python DEAP 模块,并且创建了一个最小化适应度函数和一个评估函数。我用于健身功能的代码如下:
ct.create("FitnessFunc", base.Fitness, weights=(-0.0001, -100000.0))
Run Code Online (Sandbox Code Playgroud)
请注意重量差异非常大。这是因为Fitness 的 DEAP 文档说:
权重还可用于改变每个目标相对于另一个目标的重要性。这意味着权重可以是任何实数,并且仅使用符号来确定是否进行最大化或最小化。
对我来说,这意味着你可以通过增大一个权重来优先考虑另一个权重。
我正在使用algorithms.eaSimple(通过名人堂)来进化,并且使用 来选择群体中最好的个体tools.selTournament。
评估函数返回abs(sum(input)), len(input)。运行后,我从 HallOfFame 中获取值并对其进行评估,但是,输出类似于以下内容(行尾的数字是我添加的):
(154.2830144, 3) 1
(365.6353634, 4) 2
(390.50576340000003, 3) 3
(390.50576340000003, 14) 4
(417.37616340000005, 4) 5
Run Code Online (Sandbox Code Playgroud)
让我困惑的是,我认为文档指出较大的第二个权重意味着len(input)会产生更大的影响,并会产生如下输出:
(154.2830144, 3) 1
(365.6353634, 4) 2
(390.50576340000003, 3) 3
(417.37616340000005, 4) 5
(390.50576340000003, 14) 4
Run Code Online (Sandbox Code Playgroud)
请注意,第 4 行和第 5 行交换了位置。这是因为第 4 行的权重比第 5 行的权重大得多。
看来,适应度实际上是首先根据第一个元素进行评估的,然后仅当第一个元素之间存在平局时才考虑第二个元素。如果是这样的话,那么设置除-1或+1以外的权重的目的是什么?
从帕累托最优的角度来看,无论权重如何,这两个A=(390.50576340000003, 14)解决B=(417.37616340000005, 4)方案都不优于另一个。总是f1(A) > f1(B)和f2(A) < f2(B),因此两者都不支配另一个(来源):
如果它们位于同一边界上,现在可以根据辅助指标来选择获胜者:边界中每个解决方案周围的解决方案密度,现在它占权重(加权拥挤距离)。事实上,如果您选择合适的运算符,例如selNSGA2. 您使用的操作员selTournament仅根据第一个目标进行选择:
def selTournament(individuals, k, tournsize, fit_attr="fitness"):
chosen = []
for i in xrange(k):
aspirants = selRandom(individuals, tournsize)
chosen.append(max(aspirants, key=attrgetter(fit_attr)))
return chosen
Run Code Online (Sandbox Code Playgroud)
如果您仍然想使用它,您可以考虑更新评估函数以返回目标加权和的单个输出。不过,这种方法在非凸目标空间的情况下会失败(详细信息请参阅第 12 页)。