Python 稀疏最小二乘回归

Python 稀疏最小二乘回归,python,scipy,regression,sparse-matrix,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)

我试图拟合一个线性回归
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:找不到压缩

似乎有效


不幸的是,在我的例子中,b是一个15亿x1的向量,我不能使用密集数组。有人知道使用稀疏矩阵和向量运行线性回归的变通方法或其他库吗?

文档似乎特别要求使用
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

显然数十亿次的观察对我的机器来说太多了。我最终:

  • 将算法更改为随机梯度下降(SGD):使用多个obs时速度更快
  • 删除完全稀疏的示例(即特征和标签等于零)

  • 实际上,对于2中的obs,具有最小二乘损失函数的SGD的更新规则始终为零。这将观测值从数十亿减少到数百万,结果证明在我的机器上SGD下是可行的。

    谢谢。实际上,我可能需要一些迭代的东西,因为终端在一段时间后终止了进程。
    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)