奇异值分解(SVD)应用简介

一:前言

       千里之行,始于足下,新的一年开始了,努力提升自己,从点滴做起。总结一下过去半年的工作。

二:SVD在短文本相似度的应用

       文本相似度计算中比较有名的算法Latent Semantic Analysis(LSI/LSA),就是用的SVD技术,将文档—词语矩阵(bag of words方法,或者TF,TF-IDF等)进行分解,构造低维的语义空间。用过的开源工具包是gensim,使用比较简单。我在对短文本相似度计算上使用lsi效果还不错,比gensim中的LDA好多了。原因可能1)短文本,导致向量过于稀疏 2)语料不是很大,训练不充分。

三:SVD在推荐中的应用

       首先需要区分一个概念,matrix factorization (MF)和SVD,是有区别的,Netflix中很火的SVD++,个人认为其实是MF++。在实际应用过程中说SVD,往往不怎么区分MF和SVD。

       推荐系统的基石是协同过滤,也就是KNN。其实MF,个人理解也有协同过滤的味道在里面。SVD与MF相似,都是映射到低维空间,感觉走的是同一个路子。在实践过程中,用过SVDFeature, libMF以及mllib中的ALS,SVD。前三个的实现方式都是MF的路子,后者是调用科学计算包算的SVD,因此是有不同的。SVDFeature,功能比较多,因此继承结构比较多。libMF速度更快,结构更加简单,源码容易 阅读,更加方便修改代码为自己所用,更推荐。后面的SVD是mllib包中的开源实现,速度,性能与Spark集群有关系,也与调参有很大的联系。

       我做过SVD分解用户—商品矩阵,进行商品相似度计算,结果不能看,究其原因应该是矩阵过于稀疏,给每个人推荐的商品都是流行商品。 后来尝试用户—专场矩阵分解,矩阵的数据大约在 0.5%,和Netflix的数据好像是差不多数量级的。从推荐结果来看,专场排序已经不错了,单从AUC看,很好。另一方面,MF方法比SVD结果会更加与历史数据吻合一些,相应的SVD结果的新颖性会好一点。模型的融合上,自己并没有经验,正在学习中,使用的劣质方法,反而可能会影响结果。已有的一些资料显示的方法主要有GBDT,Additive grove,Random Forest, 最近会一一尝试。Sklearn中的GBDT,RF不适宜大的数据量,会出现内存不足的问题,打算尝试Spark中的开源算法。

以现在的眼光来看,单纯的用户行为数据,应该作为特征放到LR,rankSVM等方法中, 或者SVD分解出来的特征向量添加到LR等方法中作为特征向量。

你可能感兴趣的:(算法)