SVD和奇异/非奇异矩阵

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似乎只是很好地执行其工作,即使一些列完全相同,它将在结果分解中显示哪些列/行是无用的,因为在UV中具有0分量)
2. 现在,计算大矩阵的SVD有时需要太长时间,我试图通过删除相同的列来减小其大小,但我发现实际上添加虚拟相同向量可以使它更快。这正常吗?发生了什么?
从逻辑上讲,我想要我的矩阵包含尽可能多的信息,因此:
[A] 删除所有相同列,在最好的情况下,也许
[B] 移除线性相关列。
做[A]似乎非常简单,而且计算代价不高,我可以在构造时哈希我的向量以检查可能相同的向量,然后花时间检查这些向量,但是是否有好的计算技术可用于[A]和[B]?
(对于[A],我希望不必以暴力方式检查新向量与整个过去向量的相等性,至于[B],我不知道有什么好方法来检查/执行它)。
关于我的第二个问题,为什么只添加一个类似的列就会导致SVD的运行时间行为如此巨大的变化?这是正常的可能行为,还是意味着我应该寻找SVDLIBC中的错误?
1个回答

0

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

为了回答你关于使用库时出现慢速行为是否是错误的问题,我建议尝试使用另一个工具检索同一矩阵的SVD。例如,在Octave中检索矩阵的SVD以比较运行时间:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接