Matrix 在tweet上执行SVD。记忆问题

Matrix 在tweet上执行SVD。记忆问题,matrix,data-mining,svd,Matrix,Data Mining,Svd,编辑:我的字表比我写的要大10-20倍。我只是忘记了零 EDIT2:我将研究SVDLIBC,并了解如何将矩阵简化为其密集版本,这样可能也会有所帮助 我已经生成了一个巨大的csv文件,作为词性标记和词干分析的输出。看起来是这样的: word1, word2, word3, ..., word 150.000 person1 1 2 0 1 person2 0 0 1 0 ... person

编辑:我的字表比我写的要大10-20倍。我只是忘记了零

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

我已经生成了一个巨大的csv文件,作为词性标记和词干分析的输出。看起来是这样的:

        word1, word2, word3, ..., word 150.000
person1   1      2      0            1
person2   0      0      1            0
...
person650
它包含每个人的字数。像这样,我得到每个人的特征向量

我想在这个beast上运行一个SVD,但矩阵太大,无法保存在内存中执行操作。我的问题是:

  • 我是否应该通过删除列和为1的单词来减小列大小,例如,这意味着它们只使用过一次。我这样做是否会使数据偏差过大

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


-->因此,总的来说,我在征求关于如何在这样一个语料库上执行svd的建议。

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


使用稀疏矩阵SVD算法就足够了。e、 g

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


使用稀疏矩阵SVD算法就足够了。e、 g

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

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


是一个在hadoop上运行的分布式数据挖掘库,它有一个并行SVD,SVD受内存大小的限制。见:

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



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

它是大而密集还是小而稀疏?@el。我的意思是,矩阵存储在一个密集的二维数组中。它需要很多内存。然而,我认为矩阵中的非零项可以安全地存储在内存中,因此可以应用稀疏SVD算法。是的,如果他只需要几个奇异值/向量对,他肯定可以利用稀疏SVD算法。然而,我真的不明白为什么这是必要的。所描述的矩阵根本不是很大。@SF。你是对的!这个矩阵在其密集格式中也不是很大。就像@Yin-Zhu所说的,使用矩阵稀疏性。不要“将矩阵简化为其密集版本”!此外,您还可以查看。你可能会发现它比原来的C/Fortranish野兽更容易使用。它是大而密集还是小而稀疏?@el。我的意思是,矩阵存储在一个密集的二维数组中。它需要很多内存。然而,我认为矩阵中的非零项可以安全地存储在内存中,因此可以应用稀疏SVD算法。是的,如果他只需要几个奇异值/向量对,他肯定可以利用稀疏SVD算法。然而,我真的不明白为什么这是必要的。所描述的矩阵根本不是很大。@SF。你是对的!这个矩阵在其密集格式中也不是很大。就像@Yin-Zhu所说的,使用矩阵稀疏性。不要“将矩阵简化为其密集版本”!此外,您还可以查看。您可能会发现它比原来的C/Fortranish beast更容易使用。您需要多少个单数值?就几个最小的还是最大的?矩阵的维数真的只有650乘14400吗?如果是这样的话,那就根本不是很大了。我能够生成这样大小的随机矩阵,并在我的笔记本电脑上用matlab在不到5秒钟的时间内计算出完整的SVD。我经常处理比这个大得多的矩阵。相关地,你需要奇异向量吗?记住矩阵a的奇异值是AAt特征值的正平方根,其中At表示矩阵a的转置。AAt是一个小矩阵。你想要多少奇异值?就几个最小的还是最大的?矩阵的维数真的只有650乘14400吗?如果是这样的话,那就根本不是很大了。我能够生成这样大小的随机矩阵,并在我的笔记本电脑上用matlab在不到5秒钟的时间内计算出完整的SVD。我经常处理比这个大得多的矩阵。相关地,你需要奇异向量吗?记住矩阵a的奇异值是AAt特征值的正平方根,其中At表示矩阵a的转置。AAt是一个小矩阵。尽管如此,这确实不是一个大矩阵,所以我不完全理解海报为什么会遇到麻烦……我再次检查了我的矩阵:尺寸是650*150.000,所以我忘记了一个0:)。我正在使用的实现是一个围绕lapack的ruby包装器,因此可能在我遇到错误的过程中的某个地方。我还试着用rapidminer开发它,它允许我在矩阵上使用SVD,但它似乎也有内存错误。我想知道词数是多少,只是简单地删除所有只出现一次的单词。这将大大减少矩阵的维数。无论如何,谢谢你的帮助,我会调查一下SVDLIBC。@plotti 650 x 150000还不是很大。作为一个双精度阵列,这需要大约650*150000*8*(1/1024)*(1/1024)=744 MB。这应该仍然可以放入内存中(在我的笔记本电脑上)。LAPACK可以轻松地直接处理这种大小的矩阵,但是我不确定Ruby包装器是如何工作的。如果您在上面提供更多信息,我可以更好地帮助您确定应该查看哪些算法。SVD不受内存限制。计算它的一些算法是。有些不是。例如,请参见,它可以处理无限的数据集。但同意其他评论者的意见,OP的矩阵非常小(最多650个),任何包都应该这样做。Hadoop绝对是一种过度使用。另请参见。尽管如此,这并不是一个大矩阵,所以我不完全理解pos的原因