所以我有以下问题要最小化。我需要找到一个向量w
,以便最小化以下函数:
import numpy as np
from scipy.optimize import minimize
matrix = np.array([[1.0, 1.5, -2.],
[0.5, 3.0, 2.5],
[1.0, 0.25, 0.75]])
def fct(x):
return x.dot(matrix).dot(x)
x0 = np.ones(3) / 3
cons = ({'type': 'eq', 'fun': lambda x: x.sum() - 1.0})
bnds = [(0, 1)] * 3
w = minimize(fct, x0, method='SLSQP', bounds=bnds, constraints=cons)['x']
我选择method='SLSQP'
是因为它似乎是唯一允许bounds
和constraints
的。我的问题是我将不得不循环我的多个选择的解决方案,所以我试图在这里获得一些速度。我的解决方案是使用优化器的最快的,还是有其他更快的解决方案?谢谢您。
基于pylang注释,我计算了函数的jacobian,得到了以下函数:
优化问题如下
但是,该解决方案不允许添加Hessian,因为SLSQP方法不允许添加Hessian。其他优化方法也存在,但SLSQP是唯一同时接受边界和约束的方法(这是我优化问题的核心)。
完整代码见下文:
已编辑(添加了约束的雅可比):
导言
一般来说,最快的方法总是最适合问题的。
由于scipy.minimize中的所有优化算法都非常通用,因此 始终采用更快的方法,从问题的特殊特性中获得性能。 这将是一个权衡,需要做多少分析和工作来获得绩效。
需要注意的是,例如SLSQP是一个算法,它能够 处理非凸问题,在这种情况下,保证收敛到某些局部最优 (忽略实现中的数字问题;这总是一个可能的问题)。
这种能力是有代价的:与算法相比,SLSQP的速度和健壮性都会降低 专门为凸问题(甚至在凸问题中,尽管 它们都是多项式可解的,有简单的线性规划,也有困难的 作为半定义编程)。
问题分析
如上所述,对于一些一般的不定矩阵M,这个问题 是非凸的(概率很高;我没有给出形式证明),这意味着, 如果没有进一步的假设(忽略 特殊分析是一些非凸问题可以在多项式时间内全局求解)。
这意味着:
假设:M为正定/负定
如果我们假设矩阵M是正定或负定的,但不是不定的,这是一个凸优化问题。由于你似乎对这个案例感兴趣,这里有一些评论和方法。
这意味着:
使用Python+cvxpy+ecos/scs的示例代码
除了用于线性规划的linprog,没有特殊的凸优化求解器 因此无法解决这个问题。
不过,如上所述,还有其他选择,有许多可能的路线 使用它们。
在这里,我将介绍一个最简单的:
示例代码:
代码:
示例输出:
额外示例:5000x5000使用~9分钟(不调整参数)。
一些小小的额外评论:
相关问题 更多 >
编程相关推荐