Spark GraphX 学习笔记——影片推荐:SVDPlusPlus (监督学习)

15 篇文章 0 订阅
6 篇文章 0 订阅
影片推荐: 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 实战

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值