📅  最后修改于: 2023-12-03 14:51:43.232000             🧑  作者: Mango
奇异值分解是一种重要的矩阵分解方法,它广泛应用于信号处理、图像处理、推荐系统等领域,在机器学习和数据分析中具有重要的应用价值。
对于一个 $m\times n$ 的矩阵 $A$,它的奇异值分解可以表示为:
$$A=U\Sigma V^T$$
其中 $U$ 是 $m\times m$ 的正交矩阵,其每一列称为 $A$ 的左奇异向量;$V$ 是 $n\times n$ 的正交矩阵,其每一列称为 $A$ 的右奇异向量;$\Sigma$ 是 $m\times n$ 的矩阵,其中 $\Sigma_{i,j}=0$,若 $i \neq j$,否则 $\Sigma_{i,j}=\sigma_i$,其中 $\sigma_i$ 是 $A$ 的奇异值,是非负实数,按照递减顺序排列。
由于在奇异值排序后,奇异值通常会递减得非常迅速,因此可以通过保留其中最大的 $k$ 个奇异值,来实现对矩阵进行近似表示的效果。这种截断的奇異值分解可以表示为左右取 $k$ 个奇异值的版本。
$$A \approx \tilde{U}\tilde{\Sigma}\tilde{V}^T$$
其中 $\tilde{U}$ 是 $m\times k$ 的矩阵,由 $A$ 的左边 $k$ 个奇异向量组成;$\tilde{V}$ 是 $n\times k$ 的矩阵,由 $A$ 的右边 $k$ 个奇异向量组成;$\tilde{\Sigma}$ 是 $k\times k$ 的矩阵,对角线上的元素是矩阵 $A$ 的前 $k$ 个奇异值。
奇异值分解可以被用做求出数据的主要成分,并且根据奇异值的相对大小来对矩阵进行降维。在降维后,可以将数据用更少的数据来描述,减少了不必要的噪音,同时使得数据可以被更快地分析。
在推荐系统中,用户行为可以表示为一个 $m\times n$ 的矩阵,其中每一行代表一个用户,每一列代表一个物品,每个元素是用户的评分。使用奇异值分解可以将大矩阵分解为三个较小的矩阵:用户矩阵、物品矩阵和奇异值矩阵。这些矩阵的积将得到原来的矩阵,但是,这些矩阵的积是约简和多余的,因此可以省略一些元素,以减少存储和计算时间。通过计算被省略的元素,可以预测用户尚未评分的物品,从而推荐对用户可能有兴趣的物品。
Python中的numpy包提供了奇异值分解的实现,可以使用linalg模块中的svd函数来实现:
import numpy as np
# 构造一个 4x4 的矩阵
A = np.random.randn(4, 4)
# 奇异值分解
U, Sigma, VT = np.linalg.svd(A)
# 显示结果
print('U={}'.format(U))
print('Sigma={}'.format(Sigma))
print('VT={}'.format(VT))
在该代码中,生成了一个 $4\times 4$ 的正态分布随机矩阵 $A$,对其进行奇异值分解,并输出了左、中和右奇异向量。