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
显然数十亿次的观察对我的机器来说太多了。我最终:
实际上,对于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)