我需要使用矩阵的SVD形式从一系列文档中提取概念。我的矩阵的格式为A = [d1, d2, d3 ... dN]
,其中di
是M
个组件的二进制向量。然后,svd分解为我svd(A) = U x S x V'
提供了包含奇异值的S
。
我使用SVDLIBC在nodejs中进行处理(使用我编写的小模块来使用它)。它似乎运作良好,但我注意到在运行时行为中有些奇怪的东西取决于我的矩阵的状态(其中N,M正在增长,但每个已经超过1000)。 首先,我没有考虑提取相同的文档向量,但现在经过一些测试后,看起来两次添加文档有时会加快处理速度。
U
或{{0}}中有0个组件是无用的{1}})逻辑上,我要说我希望我的矩阵包含尽可能多的信息,因此
做[A]看起来非常简单而且计算成本太高,我可以在构造中哈希我的向量来检查可能相同的向量,然后花时间检查这些,但是有很好的计算技术[A]和[B]?
(我很感激[A]不必用蛮力的方式检查一个新向量的相等性,而对于[B],我不知道检查它/做什么的好方法它)。
添加了相关问题:关于我的第二个问题,为什么SVD的运行时行为会因为添加一个类似的列而大幅改变?这是正常的可行行为,还是意味着我应该在SVDLIBC中查找错误?
答案 0 :(得分:0)
如果没有快速和慢速输入矩阵的样本,很难说问题出在哪里。但是,由于SVD的主要用途之一是提供消除协方差的旋转,冗余(或相同)列不应导致问题。
要回答关于缓慢行为是否是您正在使用的库中的错误的问题,我建议尝试使用其他工具检索相同矩阵的SVD。例如,在Octave中,检索矩阵的SVD以比较运行时:
[U, S, V] = svd(A)