python - 使用 scipy 的低阶近似

标签 python numpy scipy nlp svd

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

假设我的字典包含 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 - 使用 scipy 的低阶近似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56198440/

相关文章:

python Pandas : Using apply() to subtract a value from an array

python - 我如何弄清楚为什么 Python 在 Windows 7 64 位中抛出这个非描述性错误

python - 在 python/scikit/numpy 中替代 r 的指数平滑状态空间模型

python - 使用 SFTP 的 Paramiko 中的身份验证类型错误

python - Python 新手……Python 3 和 Matplotlib

python - numpy.concatenate 如何在列表上工作

python - 硬编码置信区间作为条形图中的 mustache

python - 无法在 ubuntu 上升级 redis-py 包

python - Pandas - 使用 groupby sum 和 where 子句创建新列

Python vlc 检查歌曲是否正在播放