使用scipy的低秩近似

时间:2019-05-18 11:18:20

标签: python numpy scipy nlp svd

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

假设我有40000个单词和2000个文档的字典。那么我的逐项文档矩阵是40 000 x 2000。 根据维基百科,我必须先对矩阵进行SVD​​,然后应用

enter image description here

这是我用于SVD和低秩近似(矩阵稀疏)的代码:

  Route::get('{path}',"HomeController@index")->where('path','([A- 
  z\d-\/_.]+)?');

结果矩阵为:(40 000 x 20)*(20 x 20)*(20,2000)= 40 000 x 2000,这正是我刚开始的内容。

那么...低秩逼近如何精确减小矩阵的维数?

此外,我将在这个近似矩阵上进行查询,以查找用户向量和每个文档(天真的搜索引擎)之间的相关性。用户向量的尺寸为40 000 x 1,以(词袋)开头。根据同一个Wikipedia页面,这是我应该做的:

enter image description here

代码:

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)

它产生一个20 x 1的矩阵,这正是我所期望的! ((20 x 20)*(20 x 40 000)*(40 000 x 1)=(20 x 1))。但是现在,它的尺寸与我要乘以的search_matrix不匹配。

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

来源:

1 个答案:

答案 0 :(得分:0)

关于低秩近似:

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

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

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