SVD(奇异值分解)
目录
简介:
奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。
定义:
在线性代数中,奇异值分解(SVD)是一个实矩阵或复矩阵的因式分解。它是将正半定正规矩阵(如具有正特征值的对称矩阵)的特征分解推广到任意m × n矩阵的极坐标分解。
相关概念(来自百度百科):
正交矩阵:如果A
= E(E为单位矩阵,AT表示“矩阵A的转置矩阵”)或
A=E,则n阶实矩阵A称为正交矩阵
特征值和特征向量:设A是n阶方阵,如果数λ和n维非零列向量x使关系式Ax=λx成立,那么这样的数λ称为矩阵A特征值,非零向量x称为A的对应于特征值λ的特征向量。式Ax=λx也可写成( A-λE)X=0。这是n个未知数n个方程的齐次线性方程组,它有非零解的充分必要条件是系数行列式| A-λE|=0。
SVD分解公式:
=
![]()
![]()
![]()
由下图可以直观地理解SVD分解公式:
SVD是直接在原始矩阵上进行的矩阵分解,并且能对非方阵矩阵分解,得到左奇异矩阵U、sigma矩阵Σ、右奇异矩阵VT。
奇异值分解可以将一个矩阵分解成3个矩阵
、
、
。
其中U、都是单式矩阵(unitary matrix),Σ是一个对角矩阵,也就是说只有对角线有值。对角元素称为奇异值。
M-线性变换 分解为 U-旋转 ∑-拉伸 -旋转
SVD计算举例:
①定义矩阵 A 为:
,则
,
②再分别求出二者的特征值和特征向量:
的特征值和特征向量为
,
,
,
的特征值和特征向量为
,
,
,
,
,
③根据
,i = 1, 2求奇异值:
解得
解得
④最终可得到A的奇异值分解为:
SVD编程实现(Python):
import numpy # 导入numpy库及linalg包
from numpy import linalg as la
A = numpy.mat(numpy.array([[0, 1], [1, 1], [0, 1]])) # 初始化矩阵
U, Sigma, VT = la.svd(A) # 使用linalg里的svd函数可求出A的SVD分解
print("U = \n", U) # 打印U,Sigma及VT
print("\nSigma = \n", Sigma)
print("\nVT = \n", VT)
输出结果:
U =
[[ 0.5 -0.5 -0.70710678]
[ 0.70710678 0.70710678 0. ]
[ 0.5 -0.5 0.70710678]]Sigma =
[1.84775907 0.76536686]VT =
[[ 0.38268343 0.92387953]
[ 0.92387953 -0.38268343]]进程已结束,退出代码为 0