数据降维的目的:
- 发现隐含特征
- 移除噪声
- 方便解释和可视化
SVD分解
SVD原理
SVD分解的一般形式:
A [ m × n ] = U [ m × r ] Σ [ r × r ] ( V [ n × r ] ) ⊤ \mathbf{A}_{[m \times n]}=\mathbf{U}_{[m \times r]} \Sigma_{[r \times r]}\left(\mathbf{V}_{[n \times r]}\right)^{\top} A[m×n]=U[m×r]Σ[r×r](V[n×r])⊤
其中:以用户和电影之间的评分来讨论这一问题,方便理解。
A A A:输入矩阵,例如:用户和电影之间的评分矩阵
U U U:列正交矩阵( m ∗ r m*r m∗r),且每一列均为单位向量,可以理解为用户和电影种类(或者说Latent factors)之间的关联矩阵
Σ \Sigma Σ:对角阵( r ∗ r r*r r∗r),根据矩阵 A A A提供的信息多少,显示每个种类(或者说Latent factors)的strength,且对角阵上的值按降序排列。
V ⊤ V^\top V⊤:行正交矩阵( n ∗ r n*r n∗r),且每一行为单位向量,表示每部电影和电影种类(或者说Latent factors)之间的关联矩阵。
结合上图,简单理解下SVD分解的含义。矩阵 U U U是user-to-concept矩阵,比较每行中三个值的大小,不难发现,第一列中前四行的值较大,刚好对应user-to-movie矩阵中,前四个用户均喜欢观看科幻类电影;矩阵 Σ \Sigma Σ是每个种类的电影所占的比例,由于在user-to-movie矩阵中,用户对科幻类电影的打分项明显高于浪漫类,所以在矩阵 Σ \Sigma Σ中科幻类电影的比重较大;矩阵 V ⊤ V^\top V⊤是电影种类和电影之间的关联程度,不难发现第一行前三个的值第一行后两个的值,刚好对应上前三部电影是科幻类。
在上面的例子中,我们不难发现,第五个和第七个用户虽然大部分的观影是浪漫类,但也存在科幻类的观影。正是由于此原因造成分解时电影种类有三类,但是实际上可以将 Σ \Sigma Σ对角阵上较小的值置为0,接下来将证明这一点。
假设矩阵 M M M的 S V D SVD SVD分解为 M = P Q R M=PQR M=PQR,则:
∣ ∣ M ∣ ∣ 2 = ∑ i ∑ j ( m i j ) 2 = ∑ i ∑ j ( ∑ k ∑ m p i k q k m r m j ) 2 ||M||^2=\sum_{i}\sum_{j}\left(m_{ij}\right)^2=\sum_{i}\sum_{j}\left(\sum_{k}\sum_{m}p_{ik}q_{km}r_{mj}{}\right)^2 ∣∣M∣∣2=i∑j∑(mij)2=i∑j∑(k∑