Python / cvxpy中快速矩阵向量乘法的优化问题

k5hmc34c  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(293)

我想解决下面的(凸)最小化问题:
最小值||x||在约束sgn(A[x,R]=y)和||x|| _2 = 1
其中A是一个mx(N+1)矩阵,x在R^N中是一个向量,\[x,R\]是一个向量,它是通过附加一个给定的数R而产生的,目标是找到x的最优值。
A是一个傅立叶矩阵,有快速的矩阵-向量、求逆等算法可用。由于这个矩阵真的很大,我需要使用利用它的优化算法。
目前,我在cvxpy中使用以下实现,它太慢了:

import cvxpy as cvx

# rewrite the problem in the form x = x^- + x^+
n = A.shape[1]-1
vx = cvx.Variable(2*n)
objective = cvx.Minimize(cvx.pnorm(vx, 1)) # min ||x||_1
constraints = [vx >= 0, cvx.multiply(A[:,:n] @ vx[:n] - A[:,:n] @ vx[n:] + A[:,n]*R, y) >= 0,
               cvx.norm(vx, 2) <= R] # sgn(A[x,1]) = y, ||x||_2 <= R
x, solve_time = solve(vx, objective, constraints)
solution = x[:n] - x[n:]

有没有办法在cvxpy中使用快速的矩阵计算?或者有没有更好的库?我发现一些实现可以在一个特殊的算法中做到这一点,但不能在一般情况下,所以我无法实现我的问题。

laawzig2

laawzig21#

不会。求解器不会调用你的矩阵乘法代码。他们自己做线性代数,这在很多方面都是非常不同的。从某种意义上说,你的矩阵乘法只是问题陈述的符号。
关于性能,它很大程度上取决于瓶颈在哪里。是在生成模型(在cvxpy本身)还是在求解器中?您使用的是什么求解器?考虑使用不同的求解器。显然,我们没有足够的信息(也没有可重现的示例)来回答这个问题。

相关问题