最小化成本函数时出现 scipy.optimize 的类型错误
TypeError with scipy.optimize when minimizing Cost func
我想用scipy.optimize优化W((1×9)矩阵)中的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")
但是我得到了这样的 TypeError
'numpy.int32' object is not callable
我将 'cons' 更改为
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])
我找不到好的解决方案。
这是因为 scipy 的最小化需要一个实际的函数(不是它的输出)来正确最小化。参见 this question。您上面的代码有效,因为您将函数引用传递给可调用函数(cons,而不是 cons(W))。您可以尝试为其创建一个 lambda 函数,例如:
cons = ({'type': 'ineq', 'fun': lambda *args: W[1]-W[0]})
我想用scipy.optimize优化W((1×9)矩阵)中的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")
但是我得到了这样的 TypeError
'numpy.int32' object is not callable
我将 'cons' 更改为
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])
我找不到好的解决方案。
这是因为 scipy 的最小化需要一个实际的函数(不是它的输出)来正确最小化。参见 this question。您上面的代码有效,因为您将函数引用传递给可调用函数(cons,而不是 cons(W))。您可以尝试为其创建一个 lambda 函数,例如:
cons = ({'type': 'ineq', 'fun': lambda *args: W[1]-W[0]})