我正在尝试拟合线性回归 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 的向量,我根本无法使用密集数组。有人知道使用稀疏矩阵和向量运行线性回归的解决方法或其他库吗?
最佳答案
似乎文档特别要求 numpy
数组。但是,考虑到您的问题的规模,也许使用线性最小二乘法的封闭形式解决方案更容易?
鉴于您要求解 Ax = b,您可以转换正规方程并求解它们。换句话说,您将求解 min ||Ax-b||
。
封闭形式的解决方案是 x = (A.T*A)^{-1} * A.T *b
。
当然,这个封闭形式的解决方案有其自身的要求(具体来说,在矩阵 A 的秩上)。
您可以使用 spsolve
求解 x
,或者如果这太昂贵,则使用迭代求解器(如 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
的值。
关于python - 稀疏最小二乘回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31895814/