原创

Spark之ALS商品推荐以及电影推荐

前言

一、一般来讲,推荐引擎试图对用户与某类物品之间的联系建模,其想法是预测人们可能喜好的物品并通过探索物品之间的联系来辅助这个过程,让用户能更快速、更准确的获得所需要的信息,提升用户的体验、参与度以及物品对用户的吸引力。

​ 在开始之前,先了解一下推荐模型的分类:

  • 1、基于内容的过滤:利用物品的内容或是属性信息以及某些相似度定义,求出与该物品类似的物品
  • 2、协同过滤:利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度
  • 3、矩阵分解(包括显示矩阵分解、隐式矩阵分解和最小二乘法)

二、当前Spark模型库中只包含基于矩阵分解的实现,其中最小二乘法(Alternating Least Squares,ALS)是一种求解矩阵分解问题的最优化方法(把稀疏的矩阵近似地转为两个稠密矩阵的乘积)。

一个推荐系统的实施,一般需要以下几个步骤:

  • 1、数据准备:获取训练模型所需的数据,比如收集用户历史以来的购买记录和浏览记录
  • 2、数据清理:大部分机器学习模型所处理的都是特征,但通常上述获取的数据都是原始形式,需要进一步处理。比如数据过滤、处理异常值、合并数据源、数据汇总等。本例重点放在评分计算规则上
  • 3、数据转化:对数据中的某些特征进行标准化(StandardScaler)、归一化(MinMaxScaler)、正则化(Normalizer)的缩放转化
  • 4、模型训练和测试回路:当数据已转化模型可识别的形式,就可以开始模型的训练和测试。把数据划分为两部分,一部分是训练数据,用于构建模型,另一部分是测试数据,用于检验模型
  • 5、模型评估:在训练数据集上运行模型并在测试集上测试其效果,进行交叉验证,评估其推荐效果
  • 6、模型优化:这部分关注对特定模型最佳参数的选择问题,通常情况下,我们会尝试调整算法中的超参数,通过多次迭代训练模型,选择最优的结果

1.用户商品推荐

数据:

file:///E:/Code/LearningBigData/spark-09-case/src/File/data2.txt

1,0,1.0
1,1,2.0
1,2,5.0
1,3,5.0
1,4,5.0
2,0,1.0
2,1,2.0
2,2,5.0
2,5,5.0
2,6,4.5
3,1,2.5
3,2,5.0
3,3,4.0
3,4,3.0
4,0,5.0
4,1,5.0
4,2,5.0
4,3,0.0

scala代码:

package com.lzhpo.spark.case1


import org.apache.spark.{SparkConf, SparkContext}
// $example on$
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
import org.apache.spark.mllib.recommendation.Rating

/**
  * 
  * <p>Create By IntelliJ IDEA</p>
  * <p>Author:lzhpo</p>
  * 
  * 《ALS商品推荐》
  * 一共七款商品,四个用户。
  *       1号用户:
  *           第一个数字是指1号用户
  *           第二个数字是这个用户买了多少款商品
  *           第三个数字是指这个用户的评分
  *               1,0,1.0   --->1号用户买了0号商品,对这个商品的打分是1.0
  *               1,1,2.0   --->1号用户买了1号商品,对这个商品的打分是2.0
  *               1,2,5.0   --->1号用户买了2号商品,对这个商品的打分是5.0
  *               1,3,5.0   --->1号用户买了3号商品,对这个商品的打分是5.0
  *               1,4,5.0   --->1号用户买了4号商品,对这个商品的打分是5.0
  *
  *       2、3、4用户以此类推。
  *
  */
object RecommDemo {
    def main(args: Array[String]): Unit = {
        val conf = new SparkConf().setAppName("Recommend").setMaster("local[4]")
        val sc = new SparkContext(conf)
        // Load and parse the data
        val data = sc.textFile("file:///E:/Code/LearningBigData/spark-09-case/src/File/data2.txt")
        //变换数据成为Rating。
        val ratings = data.map(_.split(',') match { case Array(user, item, rate) =>
            Rating(user.toInt, item.toInt, rate.toDouble)
        })

        // Build the recommendation model using ALS
        val rank = 10
        val numIterations = 10
        //交替最小二乘法算法构建推荐模型
        val model = ALS.train(ratings, rank, numIterations, 0.01)

        // 取出评分数据的(User,product)
//        val usersProducts = ratings.map { case Rating(user, product, rate) =&