面试时遇到这个问题,试图解释SVD,PCA等方法,总感觉没有很好地解释问题。
矩阵分解是机器学习常用的处理方法,包括PCA降维,协同过滤里面的分解MF等。
这里简单总结一下SVD, PCA, MF有关矩阵分解的问题。
矩阵分解
先看一下特征值分解:
设A为n*n的方阵,则
A
x
=
λ
∗
x
Ax = \lambda*x
Ax=λ∗x, 称
λ
\lambda
λ为方阵A的特征值,x为方阵A的特征向量。 特征值不是唯一的, 一个满秩方阵就有n个特征值,每个特征值对应一个特征向量,满秩方阵的特征向量也是线性无关的。如果A 是非满秩的,则对应的n个特征向量有线性相关性。(矩阵分解 也叫做 谱分析)
A = X B X − 1 A=XBX^{-1} A=XBX−1其中X是特征向量组成的矩阵,B是对角阵,对角线的值都是特征值。(A是方阵的时候,可以直接做特征分解,A不是方阵的时候无法直接特征值分解,所以成为奇异值分解)
特征值与特征向量
- 首先要明确一点: 一个矩阵代表的是一个线性变换规则,而一个矩阵的乘法运行代表的是一个变换;(矩阵与向量相乘,其实就是对该向量进行旋转和伸缩变化,一个矩阵和该矩阵的非特征向量相乘是对该向量的旋转伸缩变换;一个矩阵和该矩阵的特征向量相乘是对该向量的伸缩变换。那一个实数和一个向量相乘有什么意义呢?这个我们很清楚是对一个向量的伸缩变换。)
- 矩阵乘法对应了一个变换,是把任意一个向量变成另一个方向或长度都大多不同的新向量。在这个变换的过程中,原向量主要发生旋转、伸缩的变化。如果矩阵对某一个向量或某些向量只发生伸缩变换,不对这些向量产生旋转的效果,那么这些向量就称为这个矩阵的特征向量,伸缩的比例就是特征值。特征值特征向量的理解
- 如果把矩阵代表的变化看成一种运动,特征值就是运动的速度(拉伸的大小),特征向量就是运动的方向,其他方向的运动就是由特征向量方向的运动合成。所以最大的特征值对应的特征向量指明了运动速度的最大方向。
- 应用PCA: 特征值对应的特征向量就是理想中想取得正确的坐标轴,而特征值就等于数据在旋转之后的坐标上对应维度上的方差.也就是说,直接求出矩阵A的特征向量得出对应的特征向量。我们就能找到旋转后正确的坐标轴。这个就是特征值和特征向量的一个实际应用:“得出使数据在各个维度区分度达到最大的坐标轴。” 所以,在数据挖掘中,就会直接用特征值来描述对应特征向量方向上包含的信息量,而某一特征值除以所有特征值的和的值就为:该特征向量的方差贡献率(方差贡献率代表了该维度下蕴含的信息量的比例)。通常经过特征向量变换下的数据被称为变量的主成分,当前m个主成分累计的方差贡献率达到一个较高的百分数(如85%以上)的话,就保留着这m个主成分的数据。实现了对数据进行降维的目的。整个主成分分析的算法原理也就是这个。
SVD 与PCA的关系
-
Step-1 特征分解:
对于方阵,特征分解 A = U B U t A=UBU^t A=UBUt,其中B是对角阵,U里面的向量是特征向量,其实是把A代表的变换 分解成了旋转->伸缩->旋转。也是表征出A对应实际代表的变换。特征分解得到的U和U^t 得到的是一组特征向量 及 该特征向量对应矩阵的 转置矩阵。 -
Step-2 SVD非方阵奇异值分解:
那么对于非方阵,无法直接进行特征分解,怎么办呢?SVD奇异值分解。
SVD与特征分解有什么关系呢?如果A是m*n的非方阵,那么 A = U B V t A=UBV^t A=UBVt 这里面的B还是对角阵,U和 V t V^t Vt与方阵的U 有什么区别呢?
我们来进行如下分析:- A: m * n, A t A^t At: n*m
- A A t AA^t AAt: mm 方阵, A t A A^tA AtA: nn 方阵。我们对这两个方阵进行矩阵分解,得到如下结果:
- A A t = U C U t AA^t=UCU^t AAt=UCUt, A t A = V D V t A^tA=VDV^t AtA=VDVt 上面两个方阵可以分别得到C和D两个特征值对角阵,和U与V两个特征向量。
- 我们可以看到,对 A = U B V t A=UBV^t A=UBVt 的奇异值分解SVD, 左右分别得到的是 A A t AA^t AAt与 A t A A^tA AtA的特征向量。
- 我们可以继续推导:
A = U B V t A= UBV^t A=UBVt 则 A t A^t At 可以表示为 A t = ( U B V t ) t = V B U t A^t = (UBV^t)^t = VBU^t At=(UBVt)t=VBUt,其中B是对角阵。
A t = V B U t A^t = VBU^t At=VBUt
A A t = ( U B V t ) ( V B U t ) = U B 2 V t V U t = U B 2 U t AA^t=(UBV^t)(VBU^t) = UB^2V^tVU^t=UB^2U^t AAt=(UBVt)(VBUt)=UB2VtVUt=UB2Ut 因为B是对角阵 所以B可以移动位置到前面, V t V = E V^tV=E VtV=E因为V是特征向量组成的正交阵。 A t A = ( V B U t ) ( U B V t ) = V B 2 V t A^tA=(VBU^t)(UBV^t) =VB^2V^t AtA=(VBUt)(UBVt)=VB2Vt - 所以
A
A
t
AA^t
AAt的特征值大小为A做奇异值分解的特征值的平方, U是
A
A
t
AA^t
AAt的特征向量,V是
A
t
A
A^tA
AtA的特征向量。
我们可以知道A非方阵的时候,做SVD分解对应的特征值是 A A t AA^t AAt的特征值得平方根, SVD分解对应的左右奇异矩阵分别是 A A t AA^t AAt和 A t A A^tA AtA的特征向量。
-
Step-3 SVD与PCA的关系
PCA的解释可以参考:PCA
PCA的实现步骤是什么?对X进行PCA分析时:
1)求数据的协方差矩阵 X X t XX^t XXt,
2)将 X X t XX^t XXt做矩阵分解得到k个top大的特征值,
3)用该K个特征值对应的特征向量组成PCA。
其中 X X t XX^t XXt对应的是SVD中的左奇异矩阵。假设样本为mn,则 X X t XX^t XXt得到的左奇异阵U(取topk特征值对应的特征向量) 大小为mk , U t X U^tX UtX为 k*n,相当于数据压缩。
sklearn里面PCA主成分分解时用的也是SVD,因为SVD可以不需要计算协方差矩阵直接得到奇异值分解后的左右特征向量,具体可以参考:sklearn-pca-svd
其他矩阵计算
- 实对称矩阵 A t = A A^t=A At=A,转置等于它本身, A t A = E A^tA=E AtA=EA为正交阵。
- 实对称矩阵,不同的特征值对应的特征向量是正交的
- 正交矩阵 A t A = E A^tA=E AtA=E,E是单位阵, A − 1 A = E , A − 1 = A t A^{-1}A=E,A^{-1}=A^t A−1A=E,A−1=At 正交矩阵的转置和逆矩阵相等。
- 理解 逆矩阵:对于矩阵A可以认为是A=AE 可以认为是在单位阵的基础上左乘矩阵A 也就是进行旋转变换得到矩阵A,那么逆矩阵其实就是在A的基础左乘 A − 1 A^{-1} A−1后 又可以恢复原来的单位矩阵E,这就是逆矩阵在矩阵变换中的意义。
MF 与SVD的关系
SVD奇异值分解,计算量很大,SVD分解时要求矩阵是稠密的,但是实际的推荐场景很多矩阵是稀疏的,不满足这个要求,解决方法有哪些? 伪SVD,FunkSVD, LFM.
伪SVD:
∑
I
∈
有
评
分
的
地
方
(
y
i
−
u
i
A
v
i
t
)
2
\sum_{I\in 有评分的地方}(y_i - u_iAv_i^t)^2
∑I∈有评分的地方(yi−uiAvit)2
将奇异值融入到U和V中,就是LFM
∑
i
∈
有
评
分
(
y
i
−
u
i
v
i
t
)
2
\sum_{i\in 有评分}(y_i - u_iv_i^t)^2
∑i∈有评分(yi−uivit)2 这个就是LFM.
未完待续。。。