稀疏最小二乘回归

时间:2015-08-08 15:55:49

标签: python scipy regression sparse-matrix

我正在尝试拟合线性回归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:未找到挤压

虽然

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

似乎有效。

不幸的是,在我的情况下,b是一个15亿x 1的向量,我根本无法使用密集阵列。有没有人知道使用稀疏矩阵和向量运行线性回归的变通方法或其他库?

2 个答案:

答案 0 :(得分:1)

似乎文档特别要求numpy数组。但是,考虑到问题的规模,可能更容易使用线性最小二乘的闭合形式解决方案?

鉴于您想要求解Ax = b,您可以转换法线方程式并解决它们。换句话说,您解决了min ||Ax-b||

封闭式解决方案为x = (A.T*A)^{-1} * A.T *b。 当然,这种封闭形式的解决方案有自己的要求(具体地说,在矩阵A的等级上)。

您可以使用x来解决spsolve,或者如果它太贵,那么使用迭代求解器(如Conjugate Gradients)来获得不精确的解决方案。

代码如下:

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

答案 1 :(得分:0)

显然,我的机器数十亿的观察结果太多了。我结束了:

  1. 将算法更改为随机梯度下降(SGD):使用多个障碍更快
  2. 删除完全稀疏的示例(即要素和标签等于零)
  3. 事实上,对于2中的障碍物,具有最小平方损失函数的SGD的更新规则总是为零。这使得从数十亿到数百万的观测结果在我的机器上在SGD下变得可行。

相关问题