使用scipy的低阶近似

问题描述 投票:1回答:1

我正在尝试使用低秩近似 潜在语义索引。我认为进行低秩逼近会减小矩阵尺寸,但与我得到的结果相矛盾。

假设我的字典有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))。但是现在,它的尺寸与我要乘以的search_matrix不匹配。

所以...我在做什么错,为什么?

来源:

python numpy scipy nlp svd
1个回答
0
投票

关于低阶近似:

目标是拥有一个可以用更少的内存存储并且可以更快地进行计算的矩阵。

但是您希望它具有与原始矩阵相同的行为(特别是相同的尺寸)。

这就是为什么使用矩阵的乘积。它们给您的排名很小,但没有改变矩阵的尺寸。

© www.soinside.com 2019 - 2024. All rights reserved.