nlp - 在潜在语义分析中,如何在截断奇异值后重新组合分解矩阵?

标签 nlp linear-algebra svd latent-semantic-analysis

我在看 Matrix decompositions and latent semantic indexing (网络版 ©
2009 剑桥大学)

我试图了解您如何减少矩阵中的维数。第 13 页上有一个示例,我正在尝试使用 Python's numpy 进行复制。 .

让我们称原始出现矩阵为“a”和三个 SVD (奇异值分解)分解矩阵“U”、“S”和“V”。

我遇到的问题是,在将“S”中较小的奇异值归零后,当我使用 numpy 将“U”、“S”和“V”相乘时,答案与 pdf 中给出的不同.底部 3 行不全为零。有趣的是,当我将“S”和“V”相乘时,我得到了正确的答案。

这有点令人惊讶,但乘以“S”和“V”实际上是曼宁和舒茨的《统计自然语言处理基础》一书所说的你必须做的。但这不是pdf在第10页中所说的你必须做的。

那么这里发生了什么?

最佳答案

SV 相乘正是使用 SVD/LSA 执行降维所需要做的事情。

>>> C = np.array([[1, 0, 1, 0, 0, 0],
...               [0, 1, 0, 0, 0, 0],
...               [1, 1, 0, 0, 0, 0],
...               [1, 0, 0, 1, 1, 0],
...               [0, 0, 0, 1, 0, 1]])
>>> from scipy.linalg import svd
>>> U, s, VT = svd(C, full_matrices=False)
>>> s[2:] = 0
>>> np.dot(np.diag(s), VT)
array([[ 1.61889806,  0.60487661,  0.44034748,  0.96569316,  0.70302032,
         0.26267284],
       [-0.45671719, -0.84256593, -0.29617436,  0.99731918,  0.35057241,
         0.64674677],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
         0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
         0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
         0.        ]])

这给出了一个矩阵,其中除最后几行之外的所有行都是零,因此可以将它们删除,实际上这是您将在应用程序中使用的矩阵:
>>> np.dot(np.diag(s[:2]), VT[:2])
array([[ 1.61889806,  0.60487661,  0.44034748,  0.96569316,  0.70302032,
         0.26267284],
       [-0.45671719, -0.84256593, -0.29617436,  0.99731918,  0.35057241,
         0.64674677]])

PDF 在第 10 页描述的是获得输入 C 的低秩重构的方法。 Rank != 维度,以及重建矩阵的剪切大小和密度使得在 LSA 中使用不切实际;它的目的主要是数学上的。您可以用它做的一件事是检查重建对于 k 的各种值的效果:
>>> U, s, VT = svd(C, full_matrices=False)
>>> C2 = np.dot(U[:, :2], np.dot(np.diag(s[:2]), VT[:2]))
>>> from scipy.spatial.distance import euclidean
>>> euclidean(C2.ravel(), C.ravel())   # Frobenius norm of C2 - C
1.6677932876555255
>>> C3 = np.dot(U[:, :3], np.dot(np.diag(s[:3]), VT[:3]))
>>> euclidean(C3.ravel(), C.ravel())
1.0747879905228703

对 scikit-learn 的 TruncatedSVD 进行健全性检查(完全披露:我写的):
>>> from sklearn.decomposition import TruncatedSVD
>>> TruncatedSVD(n_components=2).fit_transform(C.T)
array([[ 1.61889806, -0.45671719],
       [ 0.60487661, -0.84256593],
       [ 0.44034748, -0.29617436],
       [ 0.96569316,  0.99731918],
       [ 0.70302032,  0.35057241],
       [ 0.26267284,  0.64674677]])

关于nlp - 在潜在语义分析中,如何在截断奇异值后重新组合分解矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20920416/

相关文章:

nlp - TF-IDF 和余弦相似度的替代方案(比较不同格式的文档)

cuda - 使用 CUDA 的复杂非对称矩阵的特征值和特征向量

python - 求解 C*M = N(C、M 和 N 是矩阵),其中 M 已知且 N 的结构在 SymPy 中给出

scipy - 为什么 scipy.sparse.linalg.svds 返回 ValueError?

matlab - MATLAB 中矩阵指数的 W * diag(S) * W' 形式的矩阵的特征分解

opencv - 我如何计算 SVD 并验证第一个奇异值与最后一个奇异值的比率是否与 OpenCV 一致?

nlp - NLP 中词汇特征和正字法特征的区别?

python - 使用 spaCy 更好的命名实体识别和相似性

parsing - 英语有正式的语法吗?

c++ - 重新插入Eigen库的稀疏矩阵