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