Spark GraphX 學習筆記——影片推薦:SVDPlusPlus (監督學習)

影片推薦: SVDPlusPlus (監督學習)

	推薦系統就是監督學習的一個例子,因爲它提供了 一些影片評分的數據,並要求預測未知的用戶對影片的評分。一般有兩種主流的方法來解決這個問題。

		1)第一種主流方法比較直接和簡單 : 對於需要處理的用戶 , Pat, 找到和他有相同愛好的其他用戶,然後給 Pat 推薦這些用戶喜歡的影片。這就是 Netflix 公司早期的推薦策略,有時被稱爲鄰居法 ( neighborhood approach ),因爲它使用了圖中相鄰用戶的信息。 這種方法的一個缺點是,有時我們難以找到一個合適的鄰居,就跟 Pat的情況一樣。同時,這種方法也忽略了影片自身的一些潛藏信息,而我們通常可以從一些可能並不相似的用戶身上收集得到這些信息。

		2)第二種主流方法是去挖掘一些隱性變量( latent variables ),避免了第一種方法需要找到與目標用戶準確匹配的其他用戶的要求。這聽起來會有點晦澀難懂,但它的基本原理並不複雜,如圖 7.4 所示 。 通過隱性變量 , 我們就可 以使用 一個向量來表示每一部影片 ,向量代表電影擁有的不同特性。我們 的例子使用了兩個隱性變量,這樣每部電影就可以使用一個二維向量來表示。儘管從圖 7.4 看來 , 《星球大戰》只具有科幻電影這一個特性,但是我們依然用 一個長度爲 2 的 向量來表示它 , 第一個維度表示它屬於科幻電影的程度,第二個維度表示它屬於浪漫電影的程度。我們可以預期的是,第一個維度的值會相當高,第二個維度的值則會相當低,然而一般也不會是 0 。

	標準的 SVD++算法是基於隱性變量和隱含信息的。

1. 構建數據,運行SVDPlusPlus
	import org.apache.spark.graphx._

	val edges = sc.makeRDD(Array(Edge(1L,11L,5.0),Edge(1L,12L,4.0),Edge(2L,12L,5.0),Edge(2L,13L,5.0),Edge(3L,11L,5.0),Edge(3L,13L,2.0),Edge(4L,11L,4.0),Edge(4L,12L,4.0)))
	
	val conf = new lib.SVDPlusPlus.Conf(2,10,0,5,0.007,0.007,0.005,0.015)
	val (g,mean) = lib.SVDPlusPlus.run(edges, conf)

2. 函數pred()以及調用方法

def pred(g:Graph[(Array[Double], Array[Double], Double, Double),Double],mean:Double, u:Long, i:Long) = {
	val user = g.vertices.filter(_._1 == u).collect()(0)._2
	val item = g.vertices.filter(_._1 == i).collect()(0)._2
	mean + user._3 + item._3 + item._1.zip(user._2).map(x => x._1 * x._2).reduce(_ + _)
}
pred(g, mean, 4L, 13L)

預測結果:
	res3: Double = 3.5234998151565518

代碼語言:scala
參考書籍:Spark GraphX 實戰

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章