svd與svd++聯繫與區別

最近一直在做基於SVD推薦方面的工作,主要使用的是Mahout提供的cf.taste.impl.recommender.svd包下的推薦器,這裏有一段參考代碼,使用的推薦器是SVDRecommender,如下所示:

public class SVDRecommenderEx {
	private static String input = "/Users/harikrishna_gurram/customer.csv";
	private static DataModel model = null;
	private static SVDRecommender recommender = null;
	private static ALSWRFactorizer fatorizer = null;

	private static String[] books = { "Meet Big Brother", "Explore the Universe", "Memoir as metafiction",
			"A child-soldier's story", "Wicked good fun", "The 60s kids classic", "A short-form master",
			"Go down the rabbit hole", "Unseated a president", "An Irish-American Memoir" };

	private static String[] userNames = { "Hari Krishna Gurram", "Gopi Battu", "Rama Krishna Gurram", "Sudheer Ganji",
			"Kiran Darsi", "Joel Chelli", "Sankalp Dubey", "Sunil Kumar", "Janaki Sriram", "Phalgun Garimella",
			"Reshmi george", "Sailaja Navakotla", "Aravind Phaneendra", "Keerthi Shetty", "Sujatha",
			"Vadiraj Kulakarni", "Arpan", "Suprabath Bisoi", "Sravani", "Gireesh Amara" };

	public static void main(String args[]) throws IOException, TasteException {
		model = new FileDataModel(new File(input));
		fatorizer = new ALSWRFactorizer(model, 5, 0.05, 10);
		recommender = new SVDRecommender(model, fatorizer);
		List<RecommendedItem> recommendations = recommender.recommend(1, 5);
		System.out.println("Recommendations for customer " + userNames[0] + " are:");
		System.out.println("*************************************************");

		System.out.println("BookId\title\t\testimated preference");
		for (RecommendedItem recommendation : recommendations) {
			int bookId = (int) recommendation.getItemID();
			float estimatedPref = recommender.estimatePreference(1, bookId);
			System.out.println(bookId + " " + books[bookId - 1] + "\t" + estimatedPref);
		}
		System.out.println("*************************************************");
	}
}

在上一段代碼中,用到的矩陣分解器Factorizer是基於最小二乘分解的分解器ALSWRFactorizer,還有一種常用的分解器SVDPlusPlusFactorizer。

其實,基於潛在(隱藏)因子的推薦,即基於隱語義模型的推薦,通常採用SVD或改進的SVD(SVD++)方式。

奇異值分解(SVD)

考慮協同過濾中最爲常見的場景:用戶給電影評分的,我們需要一個數學模型來模擬這個評分場景,比如對電影做評分預測。

將評分矩陣U看作是兩個矩陣的乘積:

其中,可以看作是user x對電影的隱藏特徵y的喜好程度,而可以看作是特徵y在電影z中的體現程度。那麼上述模型的評分預測公式爲:

其中,q 和 p 分別對應了電影和用戶在各個隱藏特質上的特徵向量。

以上的模型中,用戶和電影都體現得無差別,例如某些用戶非常挑剔,總是給予很低的評分;或是某部電影拍得奇爛,惡評如潮。爲了模擬以上的情況,需要引入 baseline predictor.


其中 μ 爲所有評分基準,bi 爲電影 i 的評分均值相對μ的偏移,bu 類似。注意,這些都是參數,需要通過訓練得到具體數值,但可以用相應的均值作爲初始化時的估計。

模型參數bi,bu,qi,pu通過最優化下面這個目標函數獲得:

其中,前一項是一種最小二乘損失函數的表達形式,第二項和第三項分別是正則化項。可以用梯度下降方法或迭代的最小二乘算法求解。在迭代最小二乘算法中,首先固定pu優化qi,然後固定qi優化pu,然後交替更新。梯度下降方法中參數的更新式子如下(爲了簡便,把目標函數中的μ+bi+bu+qipu整體替換爲r^ui):

其中α是學習速率,也是更新步長。

SVD++

某個用戶對某個電影進行了評分,那麼說明他看過這部電影,那麼這樣的行爲事實上蘊含了一定的信息,因此我們可以這樣來理解問題:評分的行爲從側面反映了用戶的喜好,可以將這樣的反映通過隱式參數的形式體現在模型中,從而得到一個更爲精細的模型,便是 SVD++.

其中 I(u) 爲該用戶所評價過的所有電影的集合,yj爲隱藏的“評價了電影 j”反映出的個人喜好偏置。收縮因子取集合大小的根號是一個經驗公式,並沒有理論依據。

模型參數bi,bu,qi,pu,yj通過最優化下面這個目標函數獲得:

SVD方法類似,可以通過梯度下降算法進行求解。

發佈了38 篇原創文章 · 獲贊 61 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章