【问题标题】:sparse least square regression稀疏最小二乘回归
【发布时间】:2015-10-31 23:10:59
【问题描述】:

我正在尝试拟合线性回归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 的向量,我根本无法使用密集数组。有人知道使用稀疏矩阵和向量运行线性回归的解决方法或其他库吗?

【问题讨论】:

    标签: python scipy regression sparse-matrix


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      似乎文档专门要求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。

      【讨论】:

      • 谢谢。事实上,我可能需要一些迭代,因为终端在一段时间后终止了进程。
      猜你喜欢
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2022-11-13
      • 2015-05-15
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多