目录
一、引言
1、什么是SVD?
SVD(奇异值分解,Singular Value Decomposition)是一种常用的矩阵分解方法。它将一个矩阵分解为三个矩阵的乘积:U、Σ和Vᵀ。
对于一个 m×n 的实数矩阵 A,它的 SVD 分解可以表示为:A = UΣVᵀ
其中,U 是一个 m×m 的正交矩阵,Σ 是一个 m×n 的对角矩阵,Vᵀ 是一个 n×n 的正交矩阵。
矩阵 U 的列向量是 AAᵀ 的特征向量,矩阵 V 的列向量是 AᵀA 的特征向量。Σ 的对角元素通常称为奇异值,表示 A 在这些方向上的奇异性。
2、特点和应用:
一般而言,SVD 分解有以下特点和应用:
-
降维:通过 SVD,可以选择保留的奇异值来实现对矩阵的降维处理。保留较大奇异值对应的列,可以有效地减少数据的维度,提取主要特征。
-
数据压缩:SVD 分解可以将原始数据压缩为较低维度的表示,同时尽量保留原始数据的信息。这在存储和传输大规模数据时非常有用。
-
矩阵逆和伪逆:SVD 分解可以用于计算矩阵的逆和伪逆。对于奇异值为零的情况,可以通过将这些奇异值取倒数来实现伪逆的计算。
-
数据去噪:SVD 可以用于去除噪音对数据的影响。通过保留较大奇异值对应的列,可以滤除与噪音相关的低能量奇异值所对应的信息。
-
推荐系统:在推荐系统中,SVD 分解可以用于对用户-物品评分矩阵进行分解,从而进行用户的兴趣预测和物品的推荐。
在实际应用中,可以使用一些数值计算库(如NumPy和SciPy)来进行矩阵的 SVD 分解。这些库通常提供了相应的函数或方法来计算矩阵的奇异值、左奇异向量和右奇异向量。
3、所需库
pip install numpy
用控制台指令下载Numpy库
二、代码实现
这段代码使用了NumPy库进行了矩阵x的SVD分解,并打印了矩阵U、奇异值Sigma和矩阵V的转置。
import numpy as np
x = np.array([[0, 1, 0], [1, 1, 1], [1, 0, 1]])
u, sigma, vt = np.linalg.svd(x)#svd是属于numpy中的算法
print(u)
print(sigma)
print(vt)
在执行这段代码之后,您可以得到以下结果:
[[-0.30628172 0.85065081 -0.4253254 ]
[-0.89052726 -0.27602622 0.35805777]
[-0.33771647 -0.4472136 -0.82612283]]
[2.15588593 1.41421356 0.39444856]
[[-0.57735027 -0.57735027 -0.57735027]
[ 0.33333333 -0.66666667 0.66666667]
[-0.74878987 0.4707393 0.46854445]]
在这里,矩阵U代表左奇异向量,是一个3x3的矩阵;奇异值Sigma是一个一维数组,按降序排列;矩阵V的转置代表右奇异向量,是一个3x3的矩阵。
请注意,SVD分解结果中的奇异值通常以降序排列。在这个示例中,奇异值按从大到小的顺序排列,而U和V的列向量对应的奇异值顺序相同。