【问题标题】:Performing a SVD on tweets. Memory problem对推文执行 SVD。内存问题
【发布时间】:2010-05-12 12:23:12
【问题描述】:

编辑:我的单词表大小是我写下的 10-20 倍。我只是忘记了一个零。

EDIT2:我将研究 SVDLIBC 并了解如何将矩阵简化为密集版本,这样也可能有所帮助。

我生成了一个巨大的 csv 文件作为我的 pos 标记和词干提取的输出。它看起来像这样:

        word1, word2, word3, ..., word 150.000
person1   1      2      0            1
person2   0      0      1            0
...
person650

它包含每个人的字数。像这样我得到每个人的特征向量。

我想在这头野兽上运行 SVD,但似乎矩阵太大而无法保存在内存中以执行操作。我的问题是:

  • 我是否应该通过删除列总和为例如 1 的单词来减小列大小,这意味着它们只被使用过一次。我是否因为这种尝试而过度偏向数据?

  • 我尝试了 rapidminer,将 csv 加载到数据库中。然后像 rapidminer 建议的那样,按批次顺序读取它进行处理。但是Mysql不能在一个表中存储那么多列。如果我转置数据,然后在导入时重新转置它也需要很长时间......

--> 所以总的来说,我是在寻求建议,如何在这样的语料库上执行 svd。

【问题讨论】:

  • 你想要多少个奇异值?只有几个最小的或最大的?矩阵的维度真的只有 650 x 14400 吗?如果是这样,那根本不是很大。我能够在不到 5 秒的时间内在我的笔记本电脑上生成一个这种大小的随机矩阵并在 matlab 中计算一个完整的 SVD。我经常处理比这大得多的矩阵。相关地,你需要奇异向量吗?请记住,矩阵 A 的奇异值是 AAt 的特征值的正平方根,其中 At 表示矩阵 A 的转置。 AAt 是一个小矩阵。

标签: matrix data-mining svd


【解决方案1】:

这是一个很大的密集矩阵。然而,它只是一个很小的稀疏矩阵。

使用稀疏矩阵 SVD 算法就足够了。例如here

【讨论】:

  • 是大而密还是小而稀疏?
  • @el。我的意思是你的矩阵存储在一个密集的,即二维数组中。它消耗大量内存。但是,我认为矩阵中的非零项可以安全地存储在内存中,因此可以应用稀疏 SVD 算法。
  • 是的,如果他只需要几个奇异值/向量对,他绝对可以利用稀疏 svd 算法。但是,我真的不明白为什么这是必要的。所描述的矩阵根本不是很大。
  • @SF。你说的对!这个矩阵的密集格式也不大。
  • 就像@Yin Zhu 所说,使用矩阵稀疏性。不要“将矩阵简化为密集版本”!此外,您可以查看Python wrapper for SVDLIBC。您可能会发现它比原来的 C/Fortranish 野兽更容易使用。
【解决方案2】:

SVD 受内存大小的限制。见:

Folding In:关于部分矩阵更新的论文。

Apache Mahout 是一个分布式数据挖掘库,运行在具有并行 SVD 的 hadoop 上

【讨论】:

  • 尽管如此,这确实不是一个大矩阵,所以我不完全理解为什么发布者会遇到麻烦......
  • 我再次检查了我的矩阵:尺寸是 650 * 150.000,所以我忘记了 0 :)。我正在使用的实现是一个围绕 lapack 的 ruby​​ 包装器,所以可能在某个地方我遇到了那个错误。我还尝试使用 rapidminer 处理它,它允许我在矩阵上使用 SVD,但它似乎也有内存错误。我想知道在字数方面只是删除所有只出现一次的单词。这将大大降低矩阵的维度。无论如何,谢谢你的帮助,我会看看 SVDLIBC。
  • @plotti 650 by 150,000 仍然不是很大。作为一个双精度数组,这需要大约 650*150,000*8*(1/1024)*(1/1024) = 744 MB。这应该仍然适合内存(它在我的笔记本电脑上)。 LAPACK 可以轻松地直接处理这种大小的矩阵,但是我不确定 Ruby 包装器是如何工作的。如果您在上面提供更多信息,我可以更好地帮助确定您应该查看哪些算法。
  • SVD 不受内存限制。一些计算它的算法是。有些不是。参见例如gensim,它可以处理无限的数据集。但与其他评论者一致认为 OP 的矩阵相当小(排名最多 650),任何包都应该这样做。 Hadoop 绝对是一种矫枉过正。另见implementations for different languages
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 2015-04-03
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多