La descomposición de valores singulares es LSA (análisis semántico latente), el algoritmo detrás del cálculo de vectores temáticos.
SVD es un algoritmo que puede descomponer cualquier matriz en 3 matrices de factores, y estas 3 matrices de factores se pueden multiplicar para reconstruir la matriz original. Esto es similar a encontrar exactamente 3 factores enteros para un entero grande, pero los factores aquí no son números enteros escalares, sino matrices reales bidimensionales con propiedades especiales. Las matrices de 3 factores calculadas por SVD tienen algunas propiedades matemáticas útiles, que pueden usarse para la reducción de dimensionalidad y LSA.
Use código para implementar la descomposición de la matriz SVD:
from nlpia.book.examples.ch04_catdog_lsa_sorted import lsa_models, prettify_tdm
import numpy as np
import pandas as pd
# 11 篇文档、词汇表大小为 6 的语料库
bow_svd, tfidf_svd = lsa_models()
print("数据:\n", prettify_tdm(**bow_svd))
# 词项-文档矩阵
tdm = bow_svd['tdm']
print("词项-文档矩阵tdm:\n", tdm)
# 奇异值分解
U, s, Vt = np.linalg.svd(tdm)
# 左奇异向量 U:主题-词矩阵
# 矩阵中每个元素位置上的权重或得分,分别代表每个词对每个主题的重要程度
print("左奇异向量 U:\n", pd.DataFrame(U, index=tdm.index).round(2))
# 奇异值向量 S:
# 奇异值给出了在新的语义(主题)向量空间中每个维度所代表的信息量。
print(s.round(1))
S = np.zeros((len(U), len(Vt)))
# np.fill_diagonal() 填充对角线元素
np.fill_diagonal(S, s)
print("奇异值向量 S:\n", pd.DataFrame(S).round(1))
# 右奇异向量Vt:该矩阵将在文档之间提供共享语义,
# 因为它度量了文档在新的文档语义模型中使用相同主题的频率。
print("右奇异向量Vt:\n", pd.DataFrame(Vt).round(2))
# 词项-文档矩阵重构误差
# 度量LSA精确率的一种方法是看看从主题-文档矩阵重构词项-文档矩阵的精确率如何。
print(tdm.shape)
print(np.product(tdm.shape))
err = []
for numdim in range(len(s), 0, -1):
S[numdim - 1, numdim - 1] = 0
reconstructed_tdm = U.dot(S).dot(Vt)
# 均方根误差(RMSE)
err.append(np.sqrt(((reconstructed_tdm - tdm).values.flatten() ** 2).sum() / np.product(tdm.shape)))
# 截断的内容越多,误差就越大
print(np.array(err).round(2))