python - 稀疏最小二乘回归

标签 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: 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/

相关文章:

python - 部署具有图形功能的平台独立 python 应用程序的最简单方法。

python - pytest & Monkeypatching - 无法获取返回值

python - 如果我想要随机非结构化数据的 3D 样条/平滑插值怎么办?

python - 使用 Python 进行套索回归 : Simple Question

python - 使用 statsmodels 的线性回归模型中将工作日作为虚拟/因子变量

python - 如何在 pyodbc 中自动调用 fetchall() 而不进行异常处理?

python - 使用 Python 创建损坏的符号链接(symbolic link)

python - 'reticulate' r-package 导入 python 脚本时出错

python - 导入错误 : 'scipy.misc import imsave' on Google Colaboratory

python - scikit-learn MLPRegressor中如何判断哪一个是训练和测试?