【问题标题】:TypeError with scipy.optimize when minimizing Cost func最小化成本函数时带有 scipy.optimize 的 TypeError
【发布时间】:2019-11-16 16:57:32
【问题描述】:

我想使用 scipy.optimize 优化 W((1×9)matrix) 中的 9 个变量。

from scipy.optimize import minimize

def func(W):
    W = W.reshape(1,9) #(1,9)
    Y = df0.values.reshape(49,1) #(49,1)
    X = df1.values.reshape(49,1) #(49,9)
    Z = np.dot(X, W.T) #(49, 1)
    Z = np.abs(Z - Y) #(49, 1)
    Cost = np.sum(Z ,axis=0, keepdims=True)
    return Cost[0][0]  #float

W = np.array([2,3,4,5,6,7,8,9,10])
cons = ({'type': 'ineq', 'fun': W[1]-W[0]})

result = minimize(func, x0=W0, constraints=cons, method="SLSQP")

但是我得到一个像这样的类型错误

'numpy.int32' object is not callable

我把“缺点”改成了

def cons(W):
    return W

cons = (
    {'type': 'ineq', 'fun': cons}
)

然后它运行良好,我得到了结果

     fun: 125.4977648197736
     jac: array([26.3666687 , 39.73333454, 46.56666756, 32.76666737, 38.23333454,
       25.20000076,  9.        ,  5.        ,  5.76666737])
 message: 'Optimization terminated successfully.'
    nfev: 332
     nit: 24
    njev: 24
  status: 0
 success: True
       x: array([7.36486798e-03, 8.29918593e-03, 9.61602518e-02, 9.17950729e-03,
       2.98795999e-12, 3.73831662e-12, 3.59100171e-12, 4.73656828e-01,
       1.77345002e+00])

我无法找到好的解决方案。

【问题讨论】:

    标签: python-3.x scipy minimization scipy-optimize scipy-optimize-minimize


    【解决方案1】:

    这是因为 scipy 的最小化需要一个实际的函数(不是它的输出)来正确最小化。见this question。您上面的代码有效,因为您将函数引用传递给可调用的代码(cons,而不是 cons(W))。您可以尝试为它创建一个 lambda 函数,例如:

    cons = ({'type': 'ineq', 'fun': lambda *args: W[1]-W[0]})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2019-09-17
      • 2018-12-15
      • 2016-08-23
      相关资源
      最近更新 更多