使用Scipy进行低秩逼近

4
我正在尝试使用低秩逼近进行潜在语义索引。我认为进行低秩逼近会减少矩阵维数,但我的结果与此相反。
假设我有一个包含40,000个单词和2000个文档的字典。那么,我的按项排序的文档矩阵是40,000 x 2000。根据维基百科的说法,我需要对矩阵进行SVD,然后应用

enter image description here

这是我用于SVD和低秩逼近的代码(矩阵是稀疏的):
import scipy
import numpy as np

u, s, vt = scipy.sparse.linalg.svds(search_matrix, k=20)
search_matrix = u @ np.diag(s) @ vt

print('u: ', u.shape) # (40000, 20)
print('s: ', s.shape) # (20, )
print('vt: ', vt.shape) # (20, 2000)

结果矩阵为:(40 000 x 20) * (20 x 20) * (20, 2000) = 40 000 x 2000,这恰好是我最初的矩阵。那么,低秩逼近如何准确地降低矩阵的维度呢?此外,我将对这个近似矩阵进行查询,以找到用户向量和每个文档之间的相关性(朴素搜索引擎)。 用户向量最初具有 40 000 x 1 的维度(词袋模型)。根据同一维基百科页面,我应该这样做:

enter image description here

代码:

user_vec = np.diag((1 / s)) @ u.T @ user_vec

这个程序生成了一个 20 x 1 的矩阵,这正是我所期望的!((20 x 20) * (20 x 40,000) * (40,000 x 1) = (20 x 1))。但现在,它的维度与我想要乘以的搜索矩阵不匹配。

那么... 我做错了什么,为什么会这样?

来源:


这个问题仍然很相关。然而,我发现在 逐项-文档 缩减矩阵计算中不使用矩阵 U 可以工作,并且确实减少了维度数量。 - zemiret
因此,对于低秩逼近的目标,请参见@matthiasbe下面的答案。我们不是减少矩阵的维数,而是将原始矩阵最具影响力的因素“移动”到前k行。然后,您可以剪切其余的n-k行,并将维度降至k个最有影响力的因素。 - zemiret
1个回答

3
关于低秩逼近:
目标是拥有一个占用更少内存且计算速度更快的矩阵。但你希望它的行为与原始矩阵相同(尤其是维度相同)。因此,你使用矩阵乘积。它们给出了一个较小的秩,但不改变矩阵的维度。

谢谢您提供这个额外的观点。我已经明白了为什么它能够这样工作,我会在我的问题下添加一条评论。 - zemiret

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