【问题标题】:In Latent Semantic Analysis, how do you recombine the decomposed matrices after truncating the singular values?在潜在语义分析中,你如何在截断奇异值后重新组合分解的矩阵?
【发布时间】:2014-01-22 02:42:09
【问题描述】:

我正在阅读 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”相乘实际上是 Manning 和 Schutze 的《统计自然语言处理基础》一书所说的你必须做的事情。但这不是 pdf 在第 10 页中所说的你必须做的事情。

那么这里发生了什么?

【问题讨论】:

  • 减少维数是一个常见的应用数学问题,所以如果你能用简单的英语得到答案,你可能会在某个数学或编程网站上得到更好的答案。我个人永远无法理解矩阵。
  • @hippietrail 看到 Russell 的链接后,我猜截断 SVD 是一种数学运算,因此它应该与数学堆栈交换相关。
  • 这个问题似乎离题了,因为它是关于作为 NLP 的辅助遇到的数学问题。它应该移动到数学或编程 SE 站点之一。我已投票关闭,但我不确定将其迁移到哪个站点最好。
  • @mtanti:如果不是矩阵乘法/分解问题,这听起来像是一个调试问题。在 SO 上,我看到了一些关于不同工具的其他问题,它们为 SVD 提供了不同的结果。可悲的是,尽管我是一名前专业程序员和当前的业余语言学家,但我无法遵循该 PDF \-:我只是想为您提供最佳答案,无论它是否是这里的主题(-:跨度>
  • 我对 @hippietrail 没有意见

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


【解决方案1】:

乘以 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]])

【讨论】:

  • @mtanti: 哪一个,UΣVᵀ?
  • 他们找到 C2 的部分,最下面的行全为零。那不是 UΣVᵀ 而是 ΣVᵀ 对吗?是pdf里的错误吧?
  • @mtanti:示例 18.4,对吗?是的,这似乎是一个错误。他们计算的不是 C₂,即低秩重构,而是压缩矩阵 Σ₂Vᵀ。真正的重建没有这些零行。
猜你喜欢
  • 2014-01-26
  • 2013-01-19
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2019-02-11
相关资源
最近更新 更多