2015-08-08 116 views
2

我想要擬合線性迴歸Ax = b其中A是一個稀疏矩陣,而b是一個稀疏向量。我試過scipy.sparse.linalg.lsqr,但顯然b需要是一個numpy(密集)數組。事實上,如果我跑稀疏最小二乘迴歸

A = [list(range(0,10)) for i in range(0,15)] 
A = scipy.sparse.coo_matrix(A) 
b = list(range(0,15)) 
b = scipy.sparse.coo_matrix(b) 
scipy.sparse.linalg.lsqr(A,b) 

我結束了:

AttributeError: squeeze not found

雖然

scipy.sparse.linalg.lsqr(A,b.toarray()) 

似乎工作。

不幸的是,在我的情況b是一個15億x 1的向量,我根本無法使用密集陣列。有人知道用稀疏矩陣和向量運行線性迴歸的解決方法或其他庫嗎?

回答

1

看來,文件專門要求numpy數組。但是,考慮到您的問題的規模,也許它更容易使用線性最小二乘的封閉形式的解決方案?

鑑於您想要求解Ax = b,您可以拋出正規方程並解決這些問題。換句話說,你會解決min ||Ax-b||

封閉表格解決方案將是x = (A.T*A)^{-1} * A.T *b。 當然,這種封閉形式的解決方案有自己的要求(具體地說,在矩陣A的等級上)。

可以解決使用spsolve或者如果這是太貴了,然後使用迭代求解器(像共軛梯度),得到一個不精確的解決方案x了。

的代碼將是:

A = scipy.sparse.rand(1500,1000,0.5) #Create a random instance 
b = scipy.sparse.rand(1500,1,0.5) 
x = scipy.sparse.linalg.spsolve(A.T*A,A.T*b) 
x_lsqr = scipy.sparse.linalg.lsqr(A,b.toarray()) #Just for comparison 
print scipy.linalg.norm(x_lsqr[0]-x) 

這對一些隨機的情況下,始終給我值小於1E-7

+0

謝謝你。事實上,我可能需要一些迭代,因爲終端在一段時間後終止了這個過程。 –

0

顯然數十億的觀察結果對於我的機器來說太多了。我結束了:

  1. 改變算法隨機梯度下降(SGD):與許多OBS
  2. 刪除完全稀疏的例子(即功能和標籤等於零)

實際上更快,更新具有最小平方損失函數的SGD規則對於2中的obs總是爲零。這減少了從數十億到數百萬的觀察值,這在我的機器下在新元下變得可行。