![](/img/trans.png)
[英]Ceres Solver : using smooth approximations for non-linear least squares
[英]Sparse constrained linear least-squares solver
這極大SO回答指向一個良好稀疏求解為Ax=b
,但是我有制約x
,使得在每個元素x
是>=0
的<=N
。
此外, A
很大 (約2e6x2e6),但非常稀疏,每行<=4
元素。
有什么想法/建議嗎? 我正在尋找類似於MATLAB的lsqlin
但具有巨大的稀疏矩陣的東西。
我基本上試圖解決稀疏矩陣上的大規模有界變量最小二乘問題 :
編輯:在CVX中 :
cvx_begin
variable x(n)
minimize( norm(A*x-b) );
subject to
x <= N;
x >= 0;
cvx_end
你的問題類似於非負最小二乘問題(NNLS),可以表述為
$$ \\ min_x || Ax-b || _2 ^ 2 \\ text {subject to} x \\ ge 0 $$,
似乎存在許多算法。
實際上,如果除了原始的非負變量$ x $之外,你還可以或多或少地將問題轉換為NNLS問題,你可以創建額外的變量$ x'$並用線性約束$ x_i + x_i'= N $鏈接它們。 這種方法的問題在於,在最小二乘解決方案中可能無法完全滿足這些額外的線性約束 - 然后嘗試用大數量加權它們可能是合適的。
您正在嘗試使用框約束來解決最小二乘法。 標准稀疏最小二乘算法包括LSQR,最近還包括LSMR。 這些只需要您應用矩陣矢量產品。 要添加約束,請注意如果您位於框的內部(沒有任何約束是“活動”),那么您將繼續使用您選擇的任何內部點方法。 對於所有活動約束,您執行的下一次迭代將停用約束,或約束您沿約束超平面移動。 通過對您選擇的算法進行一些(概念上相對簡單的)適當修改,您可以實現這些約束。
但是,通常可以使用任何凸優化包。 我親自使用Matlab軟件包CVX解決了這個確切類型的問題,它使用SDPT3 / SeDuMi作為后端。 CVX只是圍繞這些半定程序求解器的非常方便的包裝器。
你的矩陣A ^ TA是正半正定的,所以你的問題是凸的; 在設置求解器時一定要充分利用它。
大多數首選的QP求解器都是Fortran和/或非自由的; 但是我聽說過有關OOQP的好消息( http://www.mcs.anl.gov/research/projects/otc/Tools/OOQP/OoqpRequestForm.html ),雖然獲取副本有點痛苦。
如果您將模型重新表述為:
分
受制於:
那么這是一個標准的二次規划問題。 這是一種常見的模型,可以通過CPLEX或Gurobi等商業解算器輕松解決。 (免責聲明:我目前在Gurobi Optimization工作,之前曾在提供CPLEX的ILOG工作)。
CVXOPT怎么樣? 它適用於稀疏矩陣,似乎有些錐形編程求解器可能有所幫助:
http://abel.ee.ucla.edu/cvxopt/userguide/coneprog.html#quadratic-cone-programs
這是對上面doc中代碼的簡單修改,以解決您的問題:
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支持稀疏矩陣,因此對您有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.