【问题标题】:Passing multiple values for 'nelder mead' scipy optimizer为“nelder mead”scipy优化器传递多个值
【发布时间】:2018-06-05 02:11:00
【问题描述】:

我正在尝试使用 scipy 运行最小化,而 nelder mead 不受约束。

我的目标函数是:

def obj (self, x): 
    return self.fitn(x[:4], x[4],x[5],x[6]) 

def fitn(self, a, b,c,d):
   'some utility function using a,b,c,d'

 p = scipy.optimize.minimize(self.obj,np.array(a),args=(b,c,d),
                                        method='nelder-mead')

其中,

a =[0.25,0.25,0.25,0.25]
b = scalar value
c = 4 x 4 matrix
d = 1 x 4 matrix

我正面临这条消息:

obj() takes 2 positional arguments but 5 were given

【问题讨论】:

  • 函数是self.obj。它传递了self 实例(第一个参数)、优化变量(第二个参数)和args 的内容(第三到第五个参数)。例如,使用def obj(self, a, *args) 并将*args 传递给fitn 作为self.fitn(a, *args)

标签: python optimization scipy


【解决方案1】:

正如皮埃尔·德布伊尔所说,

minimize(self.obj, np.array(a), args=(b,c,d), ...

导致 5 个位置参数传递给 obj:self、a、b、c、d。 minimize 方法不会将所有参数打包到 x 中。

由于方法obj 是用两个参数def obj (self, x) 声明的,因此存在错误。写起来是一致的

def obj (self, x, b, c, d): 

我认为这也消除了您的obj 现在正在做的列表解包的需要;所以obj 失去了它的作用,可以用fitn 代替。

【讨论】:

    猜你喜欢
    • 2019-07-25
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多