1. 程式人生 > >奇異值分解(SVD)應用簡介

奇異值分解(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等方法中作為特徵向量。