SVD Dimension Reduction 奇异值分解 降维

降维的意义:

  1. 找出隐含的相关关系
  2. 去除无意义的特征
  3. 便于理解、可视化、存储

方法一:奇异值分解

可以参见以前的文章
A = USigma V^T

例子:

输入矩阵:

  • A_{[m times n]} 表示m篇文档和n个术语

分解获得:

  1. U_{[mtimes r]}表示m篇文档和r个概念
  2. Sigma_{[rtimes r]}, r的值等于矩阵A的rank
  3. V_{[ntimes r]}表示n个术语和r个概念

沿用之前TF-IDF时候的代码:

矩阵M4times 35的矩阵,表示4篇文章和35个术语

奇异值分解的几个属性:

  1. 实数矩阵A,总是可以进行奇异值分解的
  2. 分解后的U,Sigma ,V都是唯一的
  3. U,V都是列正交的(每一列都是相互垂直的单位向量)
  4. Sigma是一个对角矩阵,对角线上的元素是奇异值,且均为正数,并且从左上往下按照大小排列

测试一下U是否是列正交的

看一下U矩阵的具体内容:

这个矩阵每一行代表一篇文档,每一列代表一个概念。

  • 文档1和概念2,4相关性较高
  • 文档2和概念2,3相关性较高
  • 文档3和概念3相关性较高
  • 文档4和概念1相关性较高

看一下Sigma矩阵:

这个矩阵可以理解为4个概念的强度,揭示的是将数据投影到低维度空间中时,在各个坐标方向数据的方差。

看一下V^T矩阵:

每一行代表一个概念,每一列代表一个术语,每个元素代表的是术语与概念之间的相关关系,是将高位数据进行投影时所依据的坐标系。

验证一下分解的正确性:

奇异值降解SVD提供的是”最佳"低维度坐标系,“最佳”的含义是:将高维度数据投影到该低维度坐标系后损失的信息最少。

这个最佳的坐标系可以通过V^T矩阵获得,记得本例中的V矩阵的含义是:概念与术语之间的关系。

将原本表示“文档-术语"关系的矩阵M投影为"文档-概念",投影方法为:

QQ截图20150309182607

每一行代表一篇文档,每一列代表一个概念。

用SVD进行降维的方法:

  1. 进行SVD分解
  2. 若要降维至k维,用(U矩阵的前k列构成的矩阵)与(Sigma矩阵的前kk列构成的矩阵)进行点积
  3.  如果要将该低维度的数据表现恢复至高维度,则用2中结果与V^T矩阵的前k列所构成的矩阵进行点积

例如,投影到2维:

每一行代表一篇文章,每一列代表降至2维后,每篇文章在各个维度方向的投影。

将有损压缩的该低维度投影,恢复至原本的高维度:

原本数据是35维的,因而无法直接进行可视化。降至2维后,便可以了:

SVD_Plot

 

注意到,之前介绍过计算文档之间的相似程度,不妨用来验证一下,这个低维度的投影中,代表文档的点与点之间的距离,是否直觉上符合他们之间的相似度?

至于选择怎样的k来进行降维,通常会选择k使得,"能量"的损失在20%以内。

frac{sum_{i = 1}^{k}sigma_i^2}{sum_{i = 1}^{r}sigma_i^2} leq 0.8

2 thoughts on “SVD Dimension Reduction 奇异值分解 降维

  1. fafu

    IDF[i] = math.log(float(len(terms))/len(set(termsInDocs[terms[i]])))
    这里不应该是 IDF[i] = math.log(float(len(documents))/len(set(termsInDocs[terms[i]])))吗?

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *