python square函数在nevergrad文档中



我正在尝试学习nevergrad库,因为它在我们的代码库中使用,并遵循这些文档。

import nevergrad as ng
def square(x, y=12):
return sum((x - 0.5) ** 2) + abs(y)
# optimization on x as an array of shape (2,)
optimizer = ng.optimizers.NGOpt(parametrization=2, budget=100)
recommendation = optimizer.minimize(square)  # best value
print(recommendation.value)
# >>> [0.49971112 0.5002944 ]

代码本身可以工作(在我制作的交互式运行的小脚本中)。它吐出一个值,不完全是他们显示的,而是四舍五入到[0.5,0.5](编辑:这显然是最小值,在0)。

我不能调用平方函数。

如果我调用square(4),我得到'float object is not iterable'错误,因为sum需要一个列表(哦,该死的输入!)

如果取square([4]),得到unsupported operand type(s) for -: 'list' and 'float'

我想它会做一些矩阵代数-例如[4 -]。3 - 5。[5]但它只是抛出上述错误。

我不明白他们的意图是什么,例如为什么平方函数从x减去0.5,但最特别的是,当底层函数不起作用时,他们的优化是如何工作的,他们希望我们从中理解什么。

如果我连最基本的例子都看不懂,我想我理解其余的就会有很大的困难。

主要问题是python不解释如何执行list - scalar。例如:

[0.5, 0.5] - 0.5

将给出unsupported operand type(s) for -: 'list' and 'float'错误。

但是,numpy数组可以理解numpy。数组-标量,所以

numpy.array([0.5, 0.5]) - 0.5

将返回[0,0]。

最有可能发生的事情是nevergrad输入了一个numpy数组的值作为x参数。

下面是演示上述内容的代码片段:
import nevergrad as ng
import numpy as np
def square(x):
return sum((x - 0.5) ** 2)
# optimization on x as an array of shape (2,)
optimizer = ng.optimizers.NGOpt(parametrization=2, budget=100)
recommendation = optimizer.minimize(square)  # best value
print(recommendation.value)
# >>> [0.49999998 0.50000004]
# x = list fails
try:
square([0.5, 0.5])
except Exception as e:
print(e)
# x = list fails because list - scalar isn't supported
try:
[0.5, 0.5] - 0.5
except Exception as e:
print(e)
print('Now we use a numpy array instead')
print(square(np.array([0.5, 0.5])))

最新更新