mta*_*nti 6 nlp linear-algebra svd latent-semantic-analysis
我正在阅读Matrix分解和潜在语义索引(在线版本©2009 Cambridge UP)
我试图了解如何减少矩阵中的维数.第13页有一个例子,我试图用Python的numpy复制.
让我们将原始出现矩阵"a"和三个SVD(奇异值分解)分解为矩阵"U","S"和"V".
我遇到的麻烦是,在我将"S"中较小的奇异值归零后,当我使用numpy将"U","S"和"V"相乘时,答案并不像pdf中给出的那样.底部3行不是全部为零.有趣的是,当我只是乘以"S"和"V"时,我得到了正确的答案.
这有点令人惊讶,但乘以"S"和"V"实际上是Manning和Schutze的书"统计自然语言处理基础"所说的你必须要做的事情.但这不是pdf在第10页中所说的.
那么这里发生了什么?
乘以S和V正是使用 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. ]])
Run Code Online (Sandbox Code Playgroud)
这给出了一个矩阵,其中除了最后几行之外的所有行都是零,因此可以将它们删除,实际上,这是您在应用程序中使用的矩阵:
>>> 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]])
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
针对 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]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |