电影推荐系统-[离线推荐部分](五)离线推荐总结
1)离线推荐算法-ALS实现过程图:


离线推荐算法实现代码参考:https://www.cnblogs.com/liuxinrong/articles/13702013.html
2)ALS优化实现(求解最优参数)过程图:
 
 
 
3)其它问题:
(1)写程序中对于是否转换成DF问题
写入数据库(像MongoDB),操作的数据都是DataFrame,也就是说,要将RDD转换成DF(.toDF())
举例:
//2)关联数据和Schema
val movieOF=movieRDD.map(
  line=>{
    //用"\^"分割行数据
    val x=line.split("\\^")
    //2)定义Schema--通过case class方式(trim是将前后的空格去掉)
    Movie(x(0).trim.toInt,x(1).trim,x(2).trim,
      x(3).trim,x(4).trim, x(5).trim,x(6).trim,x(7).trim,x(8).trim,x(9).trim)
  }
).toDF() //3)RDD转换成DF,便于使用Spark SQL操作DataFrame
//2.写入MongoDB
movieOF.write
  .option("uri",mongoConfig.uri)
  .option("collection", MOVIES_COLLECTION_NAME)  //表名
  .mode("overwrite") //采用overwrite的写入方式可以不用先删除表格,先删除(双重保险)的话也可以
  .format("com.mongodb.spark.sql") //驱动的名字
  .save() //保存
DataFrame=Schema(case class)+RDD
可以在代码中填上RDD的输出操作,发现在转换成DF形式后再show()才能展现出规定好的数据形式:

| 
 ************ userRDD *********** 中间日志省略 +-----+ |value| +-----+ | 315| | 386| | 454| | 365| | 522| | 451| | 384| | 324| | 180| | 320| | 373| | 369| | 408| | 586| | 307| | 428| | 667| | 464| | 11| | 14| +-----+ only showing top 20 rows 
 ************ userMovies *********** 中间日志省略 +---+---+ | _1| _2| +---+---+ |315| 1| |315| 2| |315| 3| |315| 4| |315| 5| |315| 6| |315| 7| |315| 8| |315| 9| |315| 10| |315| 11| |315| 12| |315| 13| |315| 14| |315| 15| |315| 16| |315| 17| |315| 18| |315| 19| |315| 20| +---+---+ only showing top 20 rows 
  | 
(2)是否去重问题
对于第一个算推荐的过程中,在求用户推荐矩阵的时候使用了去重操作-distinct(),之后则是将去重后的用户名矩阵和含有电影名的矩阵进行笛卡儿积操作,

这是为了求出基于用户的预测的数据。在设定自定义类的时候,uid就放在最前面:
case class UserRecs(uid:Int,recs:Seq[Recommendation])
而在ALS优化的过程中,并没有使用去重操作。直接求的userMovies:
 
当然也没有用到笛卡儿积方法-cartesian(),这是因为最终求的是最小均方根误差,只要通过不断计算预测值和实际值之间的误差,再取最小的就能得到最优参数,并不需要基于用户做推荐。
4)对于基于用户、物品的推荐代码中算法的应用解析
(1)实现方法主要解释过程图
 
 

其中model是训练好的ALS(交替最小二乘法模型):

ALS优化参数过程图:
 
(2)问题:
在离线推荐过程中,哪部分代码用到了相似度度量算法中的欧几里得距离/皮尔逊相关系数?
注:
predict()是做预测的--回归分析
 
答:
不是体现在predict()方法中。
在此推荐系统中,并没有用到相似度度量算法中的欧几里得距离/皮尔逊相关系数。
求相似度度量是体现在自定义方法consinSim()里
采用的是余弦相似度(相似度度量方法中的一种):
 
 
需要自己实现的方法中具体的公式为:
 
向量在程序中的表现形式就是:
 
这里的a._2和b._2就相当于公式中的X 和Y
                    
                
                
            
        
浙公网安备 33010602011771号