我正在尝试使用低秩近似进行潜在语义索引。我认为进行低秩逼近可以减小矩阵尺寸,但是却与我得到的结果相矛盾。
假设我有40000个单词和2000个文档的字典。那么我的逐项文档矩阵是40 000 x 2000。 根据维基百科,我必须先对矩阵进行SVD,然后应用
这是我用于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页面,这是我应该做的:
代码:
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不匹配。
所以...我在做什么错,为什么?
来源:
答案 0 :(得分:0)
关于低秩近似:
目标是要有一个矩阵,可以用更少的内存存储并可以更快地进行计算。
但是您希望它具有与原始矩阵相同的行为(尤其是相同的尺寸)。
这就是为什么使用矩阵的乘积。它们给您的排名很小,但是没有改变矩阵的尺寸。