3

我需要使用矩阵的 SVD 形式从一系列文档中提取概念。我的矩阵的形式A = [d1, d2, d3 ... dN]是组件di的二进制向量M。然后 svd 分解给了我svd(A) = U x S x V'包含S奇异值的信息。

我使用SVDLIBC在 nodejs 中进行处理(使用我编写的一个小模块来使用它)。它似乎工作得很好,但我注意到运行时间行为中的一些非常奇怪的东西取决于我的矩阵的状态(其中 N,M 正在增长,但每个都已经超过 1000)。首先,我没有考虑提取相同的文档向量,但现在经过一些测试,看起来像添加两次文档有时会异常加快处理速度。

  1. 我是否必须确保 A 的每一列都是成对独立的?是否要求它们都是线性独立的?(我认为不,因为即使某些列完全相同,SVD 似乎也能很好地完成它的工作,它只会在结果分解中显示哪些列/行是无用的,因为在Uor中有 0 个组件V
  2. 现在计算我的大矩阵的 SVD 有时需要太多时间,我试图通过删除相同的列来减小它的大小,但我发现实际上添加相同的虚拟向量可以让它更快。这正常吗?发生了什么?

从逻辑上讲,我会说我希望我的矩阵包含尽可能多的信息,因此

  • [A] 删除所有相同的列,在最好的情况下,也许
  • [B] 删除线性相关列。

做 [A] 看起来很简单,计算成本也不高,我可以在构造时对我的向量进行散列,以检查哪些可能是相同的向量,然后花时间检查这些,但是 [A] 和 [B] 有没有好的计算技术]?
(我很感激 [A] 不必以蛮力方式检查新向量与整个过去向量的相等性,至于 [B],我不知道有什么好的方法来检查它/做它)。

添加了相关问题:关于我的第二个问题,为什么 SVD 的运行时间行为会通过添加一个类似的列而发生如此巨大的变化?这是正常的可能行为,还是意味着我应该在 SVDLIBC 中查找错误?

4

1 回答 1

0

如果没有快速和慢速输入矩阵的样本,很难说问题出在哪里。但是,由于 SVD 的主要用途之一是提供消除协方差的旋转,因此冗余(或相同)列不应引起问题。

要回答您关于缓慢行为是否是您正在使用的库中的错误的问题,我建议您尝试使用其他工具检索同一矩阵的 SVD。例如,在Octave中,检索矩阵的 SVD 以比较运行时:

[U, S, V] = svd(A)
于 2014-02-18T23:47:49.987 回答