矩阵的奇异值分解是矩阵的一种分解方式。我们可以利用矩阵的奇异值分解,提取矩阵的主要信息,从而通过比原矩阵少的数据量,来还原跟原矩阵差不多的信息。在python的numpy库中跟我们提供了svd分解的函数:
U, S, VT = numpy.linalg.svd(matrix)
该函数返回2个矩阵U、VT和1个1维的奇异值向量,这是因为奇异值矩阵是一个对角矩阵,除了对角元素外其他元素都为0,转为向量可以节省空间。我们可以通过观察奇异值向量,选取前k个奇异值(一般这k个奇异值之和占所有奇异值之和的90%)来还原原矩阵,还原方式如下:
import numpy as np
sig = np.eye(k) * sigma[: k] # 将奇异值向量的前k个奇异值转为对角矩阵
# 前k个奇异值对应矩阵U的前k列,对应矩阵VT的前k行,可以结合下图观察
new_matrix= np.dot(np.dot(U[:, :k], sig), VT[:k, :])