【发布时间】:2012-12-25 13:35:04
【问题描述】:
我需要使用矩阵的 SVD 形式从一系列文档中提取概念。我的矩阵是A = [d1, d2, d3 ... dN] 的形式,其中di 是M 组件的二进制向量。然后 svd 分解给我 svd(A) = U x S x V' 和 S 包含奇异值。
我使用SVDLIBC 在 nodejs 中进行处理(使用我编写的一个小模块来使用它)。它似乎工作得很好,但我注意到运行时行为中的一些非常奇怪的东西取决于我的矩阵的状态(其中 N,M 正在增长,但每个都已经超过 1000)。 首先,我没有考虑提取相同的文档向量,但现在经过一些测试,看起来像添加两次文档有时会加快处理速度。
- 我是否必须确保 A 的每一列都是成对独立的?是否要求它们都是线性独立的? (我认为不,因为即使某些列完全相同,SVD 似乎也能很好地完成它的工作,它只会在结果分解中显示哪些列/行是无用的,因为在
U或V中有 0 个组件) - 现在计算我的大矩阵的 SVD 有时会花费太多时间,我试图通过删除相同的列来减小其大小,但我发现实际上添加相同的虚拟向量可以使其更快。这正常吗?发生了什么事?
从逻辑上讲,我希望我的矩阵包含尽可能多的信息,因此
- [A] 删除所有相同的列,最好是删除
- [B] 删除线性相关列。
做 [A] 看起来很简单,计算成本也不高,我可以在构造时对我的向量进行散列,以检查哪些可能是相同的向量,然后花时间检查这些,但是 [A] 有没有好的计算技术和 [B]?
(我很感激 [A] 不必以蛮力方式检查新向量与整个过去向量的相等性,至于 [B],我不知道有什么好的方法来检查它/做它)。
添加了相关问题:关于我的第二个问题,为什么仅添加一个类似的列,SVD 的运行时间行为会发生如此巨大的变化?这是正常的可能行为,还是意味着我应该在 SVDLIBC 中查找错误?
【问题讨论】: