本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是机器学习专题第28篇文章,我们来聊聊SVD算法。
SVD的英文全称是Singular Value Decomposition,翻译过来是奇异值分解。这其实是一种线性代数算法,用来对矩阵进行拆分。拆分之后可以提取出关键信息,从而降低原数据的规模。因此广泛利用在各个领域当中,例如信号处理、金融领域、统计领域。在机器学习当中也有很多领域用到了这个算法,比如推荐系统、搜索引擎以及数据压缩等等。
SVD简介
我们假设原始数据集矩阵D是一个mxn的矩阵,那么利用SVD算法,我们可以将它分解成三个部分:
D = U Σ V T D = U \Sigma V^T D=UΣVT
这三个矩阵当中U是一个m x n的矩阵, Σ \Sigma Σ是一个m x n的对角矩阵,除了对角元素全为0,对角元素为该矩阵的奇异值。V是一个n x n的矩阵。U和V都是酉矩阵,即满足 U T U = I , V T V = I U^TU = I, V^T V = I UTU=I,VTV=I。也就是它乘上它的转置等于单位对角矩阵。
我们可以看下下图,从直观上感知一下这三个矩阵。
下面我们来简单推导一下SVD的求解过程,看起来很复杂,概念也不少,但是真正求解起来却并不难。会需要用到矩阵特征值分解的相关概念,如果不熟悉的同学可以先看下线性代数专题相关内容做个回顾:
首先,如果我们计算 A T A A^TA ATA可以得到一个n x n的方阵。对于方阵我们可以对它进行特征分解,假设得到特征值是 λ i \lambda_i λi,特征向量是 v i v_i vi,代入特征值的性质可以得到:
( A T A ) v i = λ i v i (A^TA)v_i = \lambda_i v_i (ATA)vi