使用optimize.minimize求解约束条件下的最优化问题,但是有时会报错“Positive directional derivative for linesearch”,代码如下:
import numpy as np
from scipy import optimize
def combine(data):
wmin = np.min(data, axis=0)
wmax = np.max(data, axis=0)
val_idx = np.argsort(-data[0]) # 索引按降序排列
n = data.shape[1]
number = []
for i in range(n):
number.append(i)
cons1 = [{'type': 'eq', 'fun': lambda x: np.sum(x) - 1}]
def cons2(a):
return {'type': 'ineq', 'fun': lambda x: x[val_idx[a]] - x[val_idx[a + 1]]}
def cons3(a):
return {'type': 'ineq', 'fun': lambda x: x[val_idx[a]] - wmin[a]}
def cons4(a):
return {'type': 'ineq', 'fun': lambda x: wmax[a] - x[val_idx[a]]}
b = list(map(cons2, number[0:n - 1]))
c = list(map(cons3, number))
d = list(map(cons4, number))
cons = cons1 + b + c + d
fun = lambda x: np.sum((x - w[1]) ** 2)
x0 = data[0]
res = optimize.minimize(fun, x0, method='SLSQP', constraints=cons)
print('最优解:', res.x)
print('迭代终止是否成功:', res.success)
print('迭代终止原因:', res.message)
if __name__ == '__main__':
w1 = np.array([[0.31, 0.26, 0.19, 0.16, 0.08],
[0.25, 0.12, 0.31, 0.17, 0.15]])
w2 = np.array([[0.3, 0.1, 0.05, 0.1, 0.1, 0.1, 0.1, 0.05, 0.05, 0.05],
[0.14, 0.23, 0.04, 0.08, 0.20, 0.06, 0.05, 0.07, 0.06, 0.09]])
combine(w1)
combine(w2)
结果为:
最优解: [0.25 0.215 0.215 0.17 0.15 ]
迭代终止是否成功: True
迭代终止原因: Optimization terminated successfully.
最优解: [0.195 0.195 0.06333333 0.1 0.1 0.1
0.06333333 0.06333333 0.06 0.06 ]
迭代终止是否成功: False
迭代终止原因: Positive directional derivative for linesearch
当数据为w1时,就能迭代成功;数据为w2时,迭代失败
望大神指点!
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y
这些优化算法通常通过选择下降方向,然后对该方向执行线搜索来工作。我认为此消息表示优化器进入了一个位置,无法找到目标函数值减小(足够快)的方向,但也无法验证当前位置是否为最小值。