也许有一个答案在某个地方漂浮,但我无法找到它。
我想尽量减少 可变 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高级功能等方面做些什么来提高性能?