3

我想使用该scipy.optimize模块来最小化一个功能。假设我的功能是f(x,a)

def f(x,a):
 return a*x**2

对于一个固定的a,我想最小f(x,a)x

scipy例如,我可以导入函数(我有fmin一个旧的 scipy:v.0.9.0),给出一个初始值x0,然后优化(文档):

from scipy.optimize import fmin
x0 = [1]
xopt = fmin(f, x0, xtol=1e-8)

失败是因为f需要两个参数并且fmin只传递一个(实际上,我什至还没有定义a)。如果我做:

from scipy.optimize import fmin
x0 = [1]
a = 1
xopt = fmin(f(x,a), x0, xtol=1e-8)

计算也将失败,因为“未定义 x”。但是,如果我定义x,则没有要优化的变分参数。

如何在这里允许将非变分参数用作函数参数?

4

3 回答 3

8

阅读其文档字符串中的args参数fmin,并使用

a = 1
x0 = 1
xopt = fmin(f, x0, xtol=1e-8, args=(a,))
于 2014-08-08T15:05:36.923 回答
3

这个args论点在这里可能是正确的方法,但这是另一种有时有用的方法。首先,您为 f 编写一个包装函数,它将一个函数和一个值作为输入,并返回一个a固定的新函数。

def fix_a(f, a):
    def f_with_fixed_a(x):
        return f(x, a)
return f_with_fixed_a

然后你可以像这样调用 fmin:

xopt = fmin(fix_a(f, a), x0, xtol=1e-8)

如果你只需要传入一个 fixed a,使用argsfmin 的关键字可能是太冗长了,但是这种方法更灵活,可以处理更复杂的情况(例如,如果你想做a一些函数x)。

于 2014-08-08T16:41:42.633 回答
0

对于您的情况,Warren 的规范解决方案可能是正确的选择。

然而,值得注意的是,您还可以优化类的成员函数。在这种情况下,您可以访问可用作参数的类变量。如果您的代码已经是基于对象的并且添加成员函数进行优化,这将特别有用。

在您的示例中,此(过度杀伤)解决方案将是:

class FunctionHolder(object):
    def __init__(self,a):
        self.a=a
    def f(self, x):
        return x*self.a

f1=FunctionHolder(1)
scipy.optimize.minimize(f1.f, x0)
于 2016-01-28T16:24:54.567 回答