cvxpy:对大型问题实施二维平稳性的最佳策略。

问题描述 投票:0回答:1

也许有一个答案在某个地方漂浮,但我无法找到它。

我想尽量减少 formula 可变 X >= 0 和第一导数矩阵 D所以 X 在列方向上是平滑的,而且数据比较大。

过去我曾用过各种方法来解决这个问题(如用 scipy.optimize.lsq_linear幽门),现在想尝试一下 cvxpy 与下面的通用方法(使用SCS,因为否则问题将无法放入内存)。

def cvxpy_solve_smooth(A, B, lambd=0):
    D = get_D(B.shape[1])
    X = cp.Variable((A.shape[1], B.shape[1]))
    cost1 = cp.sum_squares(A @ X - B)
    cost2 = lambd * cp.sum_squares(X @ D.T)
    constr = [0 <= X]
    prob = cp.Problem(cp.Minimize(cost1 + cost2), constr)
    prob.solve(solver=cp.SCS)
    return X.value

def get_D(n):
    D = np.diag(np.ones(n - 1), 1)
    np.fill_diagonal(D, -1)
    D = D[:-1]
    return D

但是,这比 scipy.optimize.lsq_linear 与稀疏矩阵。我可以在问题制定、求解选项、cvxpy高级功能等方面做些什么来提高性能?

python performance optimization sparse-matrix cvxpy
1个回答
2
投票

基于SCS的

检查一下SCS在你的无选项调用中是用什么配置的。我怀疑它是在直接模式下启动的,你也应该试试间接模式(use_indirect=True). 开启啰嗦功能(verbose=True)应该会显示当前正在使用的内容

替代品

这看起来就像仅有边界约束的平滑无约束优化。我怀疑SCS是不是正确的方法(它太强大了,太笼统了)。

我会启动 L-BFGS-B (它支持边界约束) (参考文献),例如通过 虾米. 对于原型来说,你可能会用自动数值差,但对于你的最终版本,你应该提供一个自定义的梯度。我怀疑,这将比SCS更有效。但这也取决于 准确度 你所追求的。

© www.soinside.com 2019 - 2024. All rights reserved.