SVD和奇异/非奇异矩阵

时间:2013-01-11 01:24:07

标签: node.js matrix svd

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

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

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

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

    做[A]看起来非常简单而且计算成本太高,我可以在构造中哈希我的向量来检查可能相同的向量,然后花时间检查这些,但是有很好的计算技术[A]和[B]?
    (我很感激[A]不必用蛮力的方式检查一个新向量的相等性,而对于[B],我不知道检查它/做什么的好方法它)。

    添加了相关问题:关于我的第二个问题,为什么SVD的运行时行为会因为添加一个类似的列而大幅改变?这是正常的可行行为,还是意味着我应该在SVDLIBC中查找错误?

1 个答案:

答案 0 :(得分:0)

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

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

[U, S, V] = svd(A)