为什么要对矩阵进行分解
原始的矩阵表示数据最完整的信息,分解完之后,信息不就不完整了吗?为什么要做矩阵分解?
假如有一批电商数据,有一些用户购买了一些商品,假设100万用户,10万个商品。用矩阵表示则有100万*10万的维度 ,这是一个很大的矩阵,同时也是一个稀疏的矩阵,因为每个用户不能买所有的商品。这么庞大的矩阵中,我们也无法提取出重点信息。
因此将这个大矩阵分解成多个小矩阵相乘。
基变换
基是正交的(即内积为0,或者直观说相互垂直),并且基是线性无关的。假设如果y轴和x轴不是正交的,也就是不是垂直,夹角小于90度,意味着y可以由x来表示,x也可以由y来表示。
当y与x垂直时,y无法表示x,x也无法表示y
我们不希望一个指标可以由另一个指标来表示。一旦可以这么表示,那么另一个指标存在的意义就不大了。
变换:数据与一个基做内积运算,结果作为第一个新的坐标分量,然后与第二个基做内积运算,结果作为第二个新坐标的分量。
特征值分解
矩阵里面有很多信息,来分一分, A=UΛU−1A=U \Lambda U^{-1}A=UΛU−1,其中UUU表示特征向量矩阵,Λ\LambdaΛ表示特征值矩阵。AAA必须是n*n的方阵,且有n个线性无关的特征向量。
这时我们就可以在对角矩阵当中找到比较大的了,他们就代表了主要信息。
SVD矩阵分解
上面提到的特征值分解不是挺好的吗?但是它被限制住了,如果矩阵的形状不是n*n的呢?而是m*n的形状呢?
这时就需要使用SVD矩阵分解了。
首先选前k个的特征值(一般前10%的特征值的和就占了总体的90%)。Am∗n=Um∗kΛk∗kVk∗nA_{m*n}=U_{m*k}\Lambda_{k*k}V_{k*n}Am∗n=Um∗kΛk∗kVk∗n,这样就可以得到一个近似的矩阵,这个矩阵拥有与原矩阵差不多的信息,但是大小却少了很多。
SVD推导
前提:对于一个二维矩阵M可以找到一组标准正交基v1v_1v1和v2v_2v2使得Mv1Mv_1Mv1和Mv2Mv_2Mv2是正交的。
使用另一组正交基u1u_1u1和u2u_2u2来表示Mv1Mv_1Mv1和Mv2Mv_2Mv2的方向。
其长度分别为:∣Mv1∣=σ1|Mv_1|=\sigma_1∣Mv1∣=σ1,∣Mv2∣=σ2|Mv_2|=\sigma_2∣Mv2∣=σ2,可得: Mv1=σ1u1,Mv2=σ2u2Mv_1=\sigma_1u_1,Mv_2=\sigma_2u_2Mv1=σ1u1,Mv2=σ2u2
对于向量xxx在这组基中的表示:x=(v1⋅x)v1+(v2⋅x)v2x=(v_1 · x)v_1 + (v_2·x)v_2x=(v1⋅x)v1+(v2⋅x)v2,其中(v1⋅x)(v_1 · x)(v1⋅x)表示向量的点积,点积表示投影的长度,可以通过投影到基的长度乘以基的方向来表示一个点的坐标。点积v⋅xv·xv⋅x也可以转换成行向量乘列向量 v⋅x=vTxv·x=v^Txv⋅x=vTx
可得Mx=(v1⋅x)Mv1+(v2⋅x)Mv2,Mx=(v1⋅x)σ1u1+(v2⋅x)σ2u2Mx=(v_1·x)Mv_1 + (v_2·x)Mv_2,Mx=(v_1·x)\sigma_1u_1+(v_2·x)\sigma_2u_2Mx=(v1⋅x)Mv1+(v2⋅x)Mv2,Mx=(v1⋅x)σ1u1+(v2⋅x)σ2u2,从而得到:Mx=u1σ1v1Tx+u2σ2v2Tx,M=u1σ1V1T+u2σ2v2TMx=u_1\sigma_1v_1^Tx+u_2\sigma_2v_2^Tx,M=u_1\sigma_1V_1^T+u_2\sigma_2v_2^TMx=u1σ1v1Tx+u2σ2v2Tx,M=u1σ1V1T+u2σ2v2T,化简得到:M=U∑VTM=U\sum V^TM=U∑VT