cvxpy:针对大型问题在二维中实施平滑度的最佳策略
cvxpy: best strategy for enforcing smoothness in second dimension for large problems
某个地方可能有答案,但我找不到。
我想用变量 X >= 0
和一阶导数矩阵 D
最小化 ,这样 X
在列方向上是平滑的并且数据量相对较大。
过去我使用过各种方法来解决这个问题(例如使用 scipy.optimize.lsq_linear
或 pylops) and now wanted to try out 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 高级功能等方面做些什么来提高性能?
基于 SCS
检查您的免选项呼叫中配置的 SCS。我怀疑它是以直接模式启动的,你也应该尝试间接模式 (use_indirect=True
)。打开详细信息 (verbose=True
) 应该会显示当前正在使用的内容
备选方案
这看起来像是仅具有边界约束的平滑无约束优化。我怀疑 SCS 是否是正确的方法(它太强大了;太笼统了)。
我会开火 L-BFGS-B (which supports bound-constraints) (reference impl), e.g. through scipy。对于原型,您可能会使用自动数值差异,但对于您的最终版本,您应该提供自定义梯度。我怀疑,它会比 SCS 更有效率。但这也取决于您所追求的准确性。
某个地方可能有答案,但我找不到。
我想用变量 X >= 0
和一阶导数矩阵 D
最小化 X
在列方向上是平滑的并且数据量相对较大。
过去我使用过各种方法来解决这个问题(例如使用 scipy.optimize.lsq_linear
或 pylops) and now wanted to try out 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 高级功能等方面做些什么来提高性能?
基于 SCS
检查您的免选项呼叫中配置的 SCS。我怀疑它是以直接模式启动的,你也应该尝试间接模式 (use_indirect=True
)。打开详细信息 (verbose=True
) 应该会显示当前正在使用的内容
备选方案
这看起来像是仅具有边界约束的平滑无约束优化。我怀疑 SCS 是否是正确的方法(它太强大了;太笼统了)。
我会开火 L-BFGS-B (which supports bound-constraints) (reference impl), e.g. through scipy。对于原型,您可能会使用自动数值差异,但对于您的最终版本,您应该提供自定义梯度。我怀疑,它会比 SCS 更有效率。但这也取决于您所追求的准确性。