python-3.x - 逻辑不在 scipy 稀疏矩阵上

标签 python-3.x numpy scipy scikit-learn sparse-matrix

我有一个由 W 稀疏矩阵存储在 D 中的语料库的词袋表示 word_freqs .每行是一个文档,每列是一个词。给定元素 word_freqs[d,w]表示单词 w 在文档 d 中出现的次数。

我试图通过 W 矩阵获得另一个 D not_word_occs其中,对于 word_freqs 的每个元素:

  • word_freqs[d,w]为零,not_word_occs[d,w]应该是一个。
  • 否则,not_word_occs[d,w]应该为零。

  • 最终,这个矩阵将需要与其他可能稠密或稀疏的矩阵相乘。

    我尝试了多种方法,包括:
    not_word_occs = (word_freqs == 0).astype(int)
    

    这个词用于玩具示例,但结果是 MemoryError对于我的实际数据(大约 18,000x16,000)。

    我也试过 np.logical_not() :
    word_occs = sklearn.preprocessing.binarize(word_freqs)
    not_word_occs = np.logical_not(word_freqs).astype(int)
    

    这看起来很有希望,但 np.logical_not()不适用于稀疏矩阵,给出以下错误:
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().
    

    任何想法或指导将不胜感激。

    (顺便说一句, word_freqs 是由 sklearn 的 preprocessing.CountVectorizer() 生成的。如果有一个解决方案涉及将其转换为另一种矩阵,我当然愿意接受。)

    最佳答案

    稀疏矩阵的非零位置的补集是密集的。因此,如果您想使用标准 numpy 数组实现既定目标,您将需要相当多的 RAM。这是一个快速且完全不科学的技巧,可以让您了解您的计算机可以处理多少这种类型的数组:

    >>> import numpy as np
    >>> a = []
    >>> for j in range(100):
    ...     print(j)
    ...     a.append(np.ones((16000, 18000), dtype=int))
    

    我的笔记本电脑在 j=1 时窒息。所以除非你有一台非常好的电脑,即使你能得到补充(你可以做
    >>> compl = np.ones(S.shape,int)
    >>> compl[S.nonzero()] = 0
    

    ) 内存将是一个问题。

    一种解决方法可能是不显式计算补码,我们称之为 C = B1 - A,其中 B1 是完全用 1 填充的形状相同的矩阵,而 A 是原始稀疏矩阵的邻接矩阵。例如,矩阵乘积 XC 可以写为 XB1 - XA,所以你有一个与稀疏 A 的乘法和一个与 B1 的乘法,这实际上很便宜,因为它归结为计算行和。这里的重点是您可以在不先计算 C 的情况下计算它。

    一个特别简单的例子是与 one-hot 向量相乘。这种乘法只是选择另一个矩阵的一列(如果从右边乘)或行(如果从左边乘)。这意味着您只需要找到稀疏矩阵的那一列或那行并取补码(对于单个切片没问题),如果您对单热矩阵执行此操作,如上所述,您不需要明确计算补码。

    关于python-3.x - 逻辑不在 scipy 稀疏矩阵上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42058013/

    相关文章:

    python - 我如何实现具有多个 init 继承的 super() ?

    json - 带有已安装库的 Python 3.1 推特帖子,

    python - Scipy:Hermite 函数与正交权重的集成

    python - 在 scipy 中选择积分变量

    Python - 获取最密集点的坐标

    android - 从单个脚本运行多个 Monkey Runner(Python 脚本)程序

    python - 使用 xlwt python 合并两个以上单元格

    python-2.7 - 在 Python Pandas 中聚合组并输出特定计数的百分比

    python - 如何在 pandas/numpy 中将值扩展到下一个非空?

    python - 在python中计算字符串中的字符时如何忽略标点符号