2010-06-10 109 views
7

This great SO answer指向一个良好稀疏求解器用于Ax=b,但是我有制约x使得x每个元素是一个>=0<=N稀疏约束线性最小二乘解算器

另外,A巨大的(约2e6x2e6),但非常稀疏,每行<=4元素。

任何想法/建议?我正在寻找像MATLAB的lsqlin之类的东西,但是有很大的稀疏矩阵。

我基本上是试图解决大型bounded variable least squares problem稀疏矩阵:

alt text

编辑:CVX

cvx_begin 
    variable x(n) 
    minimize(norm(A*x-b)); 
    subject to 
     x <= N; 
     x >= 0; 
cvx_end 
+0

那么使用该特定解决方案有什么问题?在执行解决方案之前,它不是高性能的,还是您想要记住的东西? – jcolebrand 2010-06-10 03:27:34

+0

我想强制执行我提到的那些限制。 – Jacob 2010-06-10 03:32:47

+0

也许我不明白这个问题,那个系统中的约束是不是可强制执行的?哪一部分显示问题?你认为这些限制应该在什么地方执行?看起来求解器是在BOOST中实现的,这意味着你真的会专注于改进BOOST库,不是吗?对不起,我知道我没有帮助,但这是一个有趣的问题。 – jcolebrand 2010-06-10 03:58:46

回答

3

您试图解决方框约束的最小二乘方。标准稀疏最小二乘算法包括LSQR和最近的LSMR。这些只需要你应用矩阵矢量产品。要添加约束条件,请注意,如果您位于方框的内部(约束都不是“激活的”),那么您将继续使用您选择的任何内点方法。对于所有活动约束,您执行的下一次迭代将停用约束,或限制您沿约束超平面移动。通过对您选择的算法进行一些(概念上相对简单的)适当的修改,您可以实现这些约束。

通常情况下,您可以使用任何凸优化软件包。我个人使用Matlab包CVX解决了这个确切类型的问题,它使用SDPT3/SeDuMi作为后端。 CVX仅仅是这些半定义程序解算器的一个非常方便的包装。

+0

是的,我意识到它是凸起的。我试过CVX,但内存不足。由于CVX已被推荐,我已经发布了我的CVX解决方案。 – Jacob 2010-06-10 13:42:12

+0

你的矩阵有多大? – Jacob 2010-06-10 19:26:10

+0

我用小密集矩阵(约100x100)。你正在Matlab中使用稀疏矩阵吗?我相信如果你使用spconvert()来构造矩阵,你不应该用尽内存。 – 2010-06-10 19:33:38

1

你的矩阵A^TA为正半定,所以你的问题是凸的;确保在设置求解器时充分利用这一点。

大多数QP求解器都是Fortran和/或非自由的;但是我听说过OOQP的好东西(http://www.mcs.anl.gov/research/projects/otc/Tools/OOQP/OoqpRequestForm.html),尽管获得副本有点痛苦。

+0

是的,我试图解决二次方式('quadprog'),但它太大了。我会看看OOQP并希望它适用于稀疏矩阵。 – Jacob 2010-06-10 13:44:20

3

你的问题类似于一个非负最小二乘问题(NNLS),其可以被配制为

$$ \ MIN_X ||斧-B || _2^2 \ {文本受} x \ ge 0 $$,

其中似乎存在许多算法。

实际上,如果除了原始的非负变量$ x $,您还可以创建其他变量$ x'$并将它们与线性约束连接起来,您可以将问题或多或少地转换为NNLS问题$ x_i + x_i' = N $。这种方法的问题在于,这些附加的线性约束可能不能完全满足最小二乘法解决方案 - 那么尝试用大数量来加权它们可能是适当的。

+0

你可以扩展这个吗? – Jacob 2010-06-10 20:56:00

+1

NNSL问题很接近但不完全是您的问题,例如可以使用MATLAB例程来解决lsqnonneg.m 实际上,优化工具箱具有lsqlin.m例程,它可以精确地解决您的问题,甚至还具有“大规模算法“;也许你可以在你的矩阵上测试它? – Fanfan 2010-06-11 22:37:03

+0

值得一试的其他工具箱:TSNNLS(Cantarella等人)针对NNLS和SLS(Adlers等人)针对您的问题 – Fanfan 2010-06-11 22:44:01

0

CVXOPT怎么样?它适用于稀疏矩阵,它似乎是一些锥规划求解的可能帮助:

http://abel.ee.ucla.edu/cvxopt/userguide/coneprog.html#quadratic-cone-programs

这是在文档中的代码的简单修改以上,解决你的问题:

from cvxopt import matrix, solvers 
A = matrix([ [ .3, -.4, -.2, -.4, 1.3 ], 
      [ .6, 1.2, -1.7, .3, -.3 ], 
      [-.3, .0, .6, -1.2, -2.0 ] ]) 
b = matrix([ 1.5, .0, -1.2, -.7, .0]) 
N = 2; 
m, n = A.size 
I = matrix(0.0, (n,n)) 
I[::n+1] = 1.0 
G = matrix([-I, I]) 
h = matrix(n*[0.0] + n*[N]) 
print G 
print h 
dims = {'l': n, 'q': [n+1], 's': []} 
x = solvers.coneqp(A.T*A, -A.T*b, G, h)['x']#, dims)['x'] 
print x 

CVXOPT支持稀疏矩阵,所以它对你很有用。

1

如果你有Matlab,这是你可以用TFOCS做的事情。这是您用来解决问题的语法:

x = tfocs(smooth_quad, { A, -b }, proj_box(0, N)); 

如果它太大而无法放入内存,则可以将A作为函数句柄传递。

1

如果重新制定模型为:

分钟
受:

那么它是一个标准的二次规划问题。这是一种常见的模型,可以使用CPLEX或Gurobi等商业求解器轻松解决。 (免责声明:我目前为Gurobi Optimization工作,之前曾为提供CPLEX的ILOG工作)。

+0

我应该补充说:y变量不是绝对必要的。您可以扩展目标并将y变量替换掉。但添加y变量会使模型和代码更易于编写和理解,并且不会使模型更难以解决。 – 2011-10-07 21:47:58