【问题标题】:Dot product of csr_matrix causes segmentation faultcsr_matrix 的点积导致分段错误
【发布时间】:2014-01-15 18:30:14
【问题描述】:

我有两个(scipy)CSR 稀疏矩阵:

A (12414693, 235470)
B (235470, 48063)

表演:

A.dot(B)

导致分段错误。

我做错了什么?

编辑

我已向 scipy 开发者社区提交了一个错误: https://github.com/scipy/scipy/issues/3212

【问题讨论】:

  • 但这些是稀疏矩阵,结果也是如此。事实上,结果应该小于 A(就维度而言)。
  • 正如@larsmans 在现已消失的评论中所建议的那样,稀疏矩阵的乘积可能会导致大量填充并给出密集填充的矩阵。这可能不是这里的问题。段。 fault 表示 scipy 代码中某处的错误。这可能是由于处理不当的内存分配失败或其他原因造成的。
  • 矩阵 A 是“一个热”向量的行矩阵,因此结果不应该太密集。这值得向 scipy 开发者社区报告吗?
  • 是的,当然;单击此处的绿色“新问题”按钮:github.com/scipy/scipy/issues。请务必提及您正在使用的 scipy 版本 (import scipy; scipy.__version__)。
  • 极端情况:在 A 中的“one hot”编码中,假设 all 1 都在 k 列中。并假设在 B 中,第 k 行中的所有值都是非零值,并且这些是唯一的非零值。那么 A 和 B 都非常稀疏,但乘积完全填充了非零值。

标签: python numpy scipy sparse-matrix


【解决方案1】:

您的问题很可能是由存储在int32 中的索引溢出引起的,这是由于您的点积具有超过 2^31 个非零条目的结果。试试下面...

>>> import scipy.sparse
>>> c = np.empty_like(A.indptr)
>>> scipy.sparse.sparsetools.csr_matmat_pass1(A.shape[0], B.shape[1], A.indptr,
                                              A.indices, B.indptr, B.indices, c)
>>> np.all(np.diff(c) >= 0)

使用您的数据,数组c12414693 + 1 项的向量,其中包含两个矩阵乘积中每行非零条目的累积数量,即C.indptr 将是如果C = A.dot(B) 成功完成。它是np.int32 类型,即使在 64 位平台上也是如此,这并不好。如果你的稀疏矩阵太大,就会溢出,最后一行会返回False,存储矩阵乘积结果的数组会被实例化为错误的大小(c的最后一项,如果确实发生了溢出,这很可能是一个负数)。如果是这样,那么是的,提交错误报告...

【讨论】:

  • 不错。不管是不是这样,他都应该提交一份错误报告。 scipy 代码不应该分段。故障。
  • 可以肯定的是,我对 C++ 不够满意,但如果问题正如我所描述的那样,那么用 npy_intps 或 ssize_ts 替换很多 ints 应该是解决这个问题所需要的一切。
  • 事情并不总是像人们希望的那么简单:github.com/scipy/scipy/issues/1833, github.com/scipy/scipy/pull/442
  • @WarrenWeckesser,所以这是设计而不是错误?只需知道scipy.sparse 矩阵不能容纳超过2 ** 31 非零元素。
  • 段。错误是一个错误。 2**31 个非零元素的限制是当前实现的限制。在上面链接的拉取请求中,@pv。正在努力消除这一限制。
【解决方案2】:

此链接可能会有所帮助:http://blog.newsle.com/2013/02/01/text-classification-and-feature-hashing-sparse-matrix-vector-multiplication-in-cython/ >。这些的乘积将太大。我不确定这篇文章的建议是否适用于您,但您可以尝试将第二个矩阵组织为 CSC 类型。

【讨论】:

  • 文章的建议不是正好相反吗?如果你的第二个矩阵是 CSC 格式,它会在乘法之前转换为 CSR,这可能会占用内存。
  • 没有。它确实认为使用 CSR-to-CSC 在纯 NumPy 中运行时间会很差,但这篇文章是关于制作自己的 CSR-to-CSC 乘法的 Cython 实现。它提倡第二个矩阵的 CSC 格式,而不是直接在 NumPy 中。例如。标题为“Cython 中的稀疏 CSR/CSC 乘法”的部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2020-12-31
  • 2019-07-21
  • 2018-07-28
相关资源
最近更新 更多