我正在尝试使用低秩近似进行潜在语义索引。我认为进行低秩近似会减少矩阵维度,但这与我得到的结果相矛盾。
假设我的字典包含 40 000 个单词和 2000 个文档。那么我的逐文档矩阵是 40 000 x 2000。根据维基百科,我必须对矩阵进行 SVD,然后应用
这是我用于 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(词袋)。根据同一维基百科页面,这是我应该做的:
代码:
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))。但现在,它的尺寸与我想要与之相乘的 search_matrix 不匹配。
那么...我做错了什么以及为什么?
来源:
关于低秩近似:
我们的目标是拥有一个可以用更少的内存存储并且可以更快地计算的矩阵。
但是您希望它具有与原始矩阵相同的行为(特别是相同的维度)。
这就是您使用矩阵乘积的原因。它们给你一个小的排名,但不改变矩阵的维度。
我是一名优秀的程序员,十分优秀!