降维具体到技术就是奇异值分解SVD,SVD怎么去实现数据降维,怎么把这些维度在尽量少的损失原始信息的情况下达到比较好的效果,这是SVD的要做的核心。
为什么要降维
损失掉很小的一部分信息,将他们降到一个低维度的子空间,这损失掉的一部分信息中也有可能是些噪声信息。
矩阵的秩
矩阵的行秩和列秩是相等的。
会有一些损失,因为那些垂直于这个空间的坐标被我们给剔除了。
SVD
SVD试图去找到一个正交的基底,很好的把我们的维度给降下来,所以他体现的效果会更好。他的实现很复杂,我们的重点是理解它。
A[m*n]的理解例如:m(每行)代表一篇文章,n(每列)代表整个词汇表中词是不是在我们的文章里出现。
奇异值分解
可以理解成一个列向量乘以一个奇异值再乘以一个行向量 + 第二个列向量乘以第二个奇异值再乘以第二个行向量
SVD的性质
正交基:单位向量互相垂直且向量长度为一。
U和V是不唯一的,他们的行和列可能会交换顺序,对角阵上的奇异值怎么换顺序,你相应的U的列就怎么换顺序和相应的V转置的行就怎么换顺序。
示例
U是“用户-主题”相似矩阵,行是用户,列是主题,每一列的得分是他在这个主题上的得分。
科幻-主题的“强度”,U矩阵的每一列都是单位正交基 也就是说每一列的元素平方和是1,V矩阵每一行也都是单位正交基 每一行的元素平方和也是1,所以U和V矩阵相乘,他的长度不会大于1,需要奇异值对他进行放大和缩小进行规约才能体现出最终计算后得到的矩阵。
V是“电影-主题”相似矩阵,V矩阵每一行对应一个主题,每一列对应一个电影
我们选前面两个电影(黑客帝国,异形),把它画成图。横坐标可以理解成黑客帝国,纵坐标可以理解成异形。从坐标图中的可以看出,它搜索黑客帝国的次数越多,搜索异形的次数也越多。如果我们用一条直线强硬的表示他的数据分布的话,假设我就把V1这个向量命名成科幻向量,那么你在科幻这个向量上的得分高,你在黑客帝国和异形上的得分就高。直线周围的距离点,我们可以理解成误差。在这个层面上,我们可以把原来两个坐标归一到一个方向上去,这个方向V1其实就是第一个右奇异向量的那个方向。
V1坐标轴的方差(“扩散”)其实就是奇异值矩阵对角阵的奇异值的大小。
SVD怎么降维?
强制将最小的奇异值设为零,矩阵分解就是约等号。
A-B是指:约等号左边的矩阵 - 约等号右边的矩阵。
SVD和PCA本质上是一样,但能用PCA的地方一定能用SVD,能用SVD的地方不一定能用PCA!!
SVD:最好的低秩近似
用去掉之后的奇异值矩阵的奇异值平方和 除以 去掉之前的奇异值矩阵的奇异值平方和,在80%-90%范围内就行!!
SVD:计算复杂度
实例:
V1是科幻主题的向量,V2是言情主题的向量,我们想求出的是5维的坐标在2维坐标系上的投影,这个投影就是他的坐标。方法就是做一个内积。
怎么求呢?其实就是用q这个人的搜索记录 乘以 电影-主题近似转换矩阵V。
这里的运算结果其实就是下图中把V矩阵移到等号左边运算后的结果。即用户在主题上的得分,把一个5维的降维到2维的情况。
从上面运算中V得出来的结果m*r,就像是主成分分析(PCA)得到的那个矩阵。SVD与PCA的关系:SVD的右奇异矩阵V就是PCA主成分分析所得到的主成分转换矩阵。
怎么证明呢?主成分分析,我们要算一个A的主成分矩阵实际上是算A*A的转置,然后求出他的特征根和对应的特征向量矩阵,而这个特征向量矩阵其实就是我们SVD的右奇异向量矩阵(V)
我们要观察两个用户是否相似,在原始的维度上不好观察,但我们通过将他们降维到主题维度就好观察了。在主题空间中求向量的夹角。如果他们相近的话,那么我们就可以把d看过而q用户没看过的电影推荐推q用户。在原始的坐标系下面q和d他们是完全正交的,看不出他们任何的关系,而降维到主题维度下他们的夹角是相近的,找到了他们的相关性,即对他们进行了聚类,聚在一起他们比较近。
这就是我们做推荐所用到的一种算法,我们是通过降维来实现的,降维把不是那么重要的特征给剔除出去,然后又保留他的核心主题,找到原本看似不那么相关,实际上在主题层面上有相关的这种相关性,基于这种相关性给用户做推荐。
这个案例不是因为数据量过大才对他降维,而是因为原始的相关性看不出来,把他降维到主题层面却能够看出相关性,这是更高级的用法。
疑问?如果没有打分数据怎么办,那就想办法找数据,豆瓣的影评,微博评论中提到某部电影的次数等等,给搜集下来(爬虫)。
SVD降维的特点
CUR分解简介
CUR类似于SVD,SVD的缺点是算的过程比较累,虽然有各自函数去优化,但还是比较慢,然后有人就想用近似的办法去表示。
思想是:从A中抽出来一些列作为一个新的矩阵C,然后从A中也抽出来一些行作为一个新的矩阵R,而U矩阵我们可以认为是C与R相交的元素位置所对应的那些值(图中画的圆圈)求违逆得到的,保持他们原来的顺序不变。在国内工业界用的不是很多,他的特点是算的特别快。
SVD vs CUR
SVD和LFM(在隐语义模型)在推荐系统中那个更常用?其实都很常用,在实际应用时两个都试一下,那个好就用哪个。