数据降维的目的:
- 发现隐含特征
- 移除噪声
- 方便解释和可视化
SVD分解
SVD原理
SVD分解的一般形式:
A[m×n]=U[m×r]Σ[r×r](V[n×r])⊤
其中:以用户和电影之间的评分来讨论这一问题,方便理解。
A:输入矩阵,例如:用户和电影之间的评分矩阵
U:列正交矩阵(m∗r),且每一列均为单位向量,可以理解为用户和电影种类(或者说Latent factors)之间的关联矩阵
Σ:对角阵(r∗r),根据矩阵A提供的信息多少,显示每个种类(或者说Latent factors)的strength,且对角阵上的值按降序排列。
V⊤:行正交矩阵(n∗r),且每一行为单位向量,表示每部电影和电影种类(或者说Latent factors)之间的关联矩阵。

结合上图,简单理解下SVD分解的含义。矩阵U是user-to-concept矩阵,比较每行中三个值的大小,不难发现,第一列中前四行的值较大,刚好对应user-to-movie矩阵中,前四个用户均喜欢观看科幻类电影;矩阵Σ是每个种类的电影所占的比例,由于在user-to-movie矩阵中,用户对科幻类电影的打分项明显高于浪漫类,所以在矩阵Σ中科幻类电影的比重较大;矩阵V⊤是电影种类和电影之间的关联程度,不难发现第一行前三个的值第一行后两个的值,刚好对应上前三部电影是科幻类。
在上面的例子中,我们不难发现,第五个和第七个用户虽然大部分的观影是浪漫类,但也存在科幻类的观影。正是由于此原因造成分解时电影种类有三类,但是实际上可以将Σ对角阵上较小的值置为0,接下来将证明这一点。
假设矩阵M的SVD分解为M=PQR,则:
∣∣M∣∣2=i∑j∑(mij)2=i∑j∑(k∑m∑pikqkmrmj)2
由于矩阵Q为对角阵:
k∑m∑pikqkmrmj=k∑pikqkkrkj
则:
∣∣M∣∣2=i∑j∑k∑l∑pikqkkrkjpilqllrlj
由于矩阵P、R为列正交矩阵,且每一列为单位向量,则:
∣∣M∣∣2=i∑j∑k∑pikpikqkkqkkrkjrkj=i∑j∑k∑pik2qkk2rkj2=k∑qkk2
假设A=UΣV⊤、B=USV⊤,矩阵S的前k个对角线的值与矩阵Σ的前k个相同,后面的值为0。则:
∣∣A−B∣∣=∣∣UΣV⊤−USV⊤∣∣=∣∣U(Σ−S)V⊤∣∣
可见∣∣A−B∣∣的误差与Σ矩阵的后几个对角线值的平方等价,所以在对SVD分解进行降维时,直接将对角矩阵上较小的值置为0是有道理的。
计算SVD分解矩阵
设矩阵M的SVD分解为M=UΣVT,则MT=(UΣVT)T=(VT)TΣTUT=VΣTUT=VΣUT,MTM=VΣUTUΣVT=VΣ2VT,两边同时乘V,MTMV=VΣ2VTV=VΣ2,故矩阵M⊤M的特征向量组就是所求的V,其特征根的平方根就是对角阵Σ,同理,可以求出矩阵U。
SVD应用
现在有某个用户对于所看电影打分为[50000],现在将此向量乘以矩阵V,得到[2.80.6],可以推断出该用户更加喜欢科幻类的电影,在这里,也可以理解矩阵V为新的坐标轴
但SVD分解存在的问题是当矩阵比较稀疏时,分解得到的矩阵将会特别稠密。
CUR分解
CUR分解的一般形式:
A=CUR
其中,矩阵A为输入矩阵(m∗n)
C:在矩阵A中随机选择r列所形成,m∗r
R:在矩阵A中随机选择r行所形成,r∗n
U:r∗r
矩阵C、R的选择策略:

假设矩阵W为矩阵C、R的交叉部分,且矩阵的W的SVD分解为W=XΣY⊤,Σ+为Σ的逆矩阵或者伪逆矩阵,U=Y(Σ+)2XT