从协同过滤的分类来说,ALS(Alternating Least Squares,交替最小二乘)算法属于User-Item CF,也叫做混合CF,它同时考虑了User和Item两个方面,通过数量相对少的未被观察到的隐藏因子,来解释大量用户和物品之间潜在联系。ALS基于矩阵分解通过降维的方法来补全用户-物品矩阵,对矩阵中没有出现的值进行估计。
用户和物品的关系,可以抽象为如下的三元组:<User,Item,Rating>。其中,Rating是用户对商品的评分,表征用户对该商品的喜好程度。
ALS基本假设:任何一个评分矩阵均可近似分解成两个低维的用户特征矩阵和物品特征矩阵。矩阵分解过程可理解成将用户和物品均抽象的映射到相同的低维潜在特征空间中。因此其基本思想是对稀疏矩阵进行模型分解,评估出缺失项的值,以此来得到一个基本的训练模型,然后依照此模型可以针对新的用户和物品数据进行评估。ALS是采用交替的最小二乘法来算出缺失项,交替最小二乘法是在最小二乘法的基础上发展而来的。
1、spark代码实现
1.1 数据入口
case class ProductRating(userId:Int, productId:Int, score:Double)
/** 训练最好模型输出
- @param bestModel 模型
- @param bestRanks 隐含因子
- @param bestIters 迭代次数
- @param bestLambdas 惩罚值
- @param bestRmse 最佳方差值**/
case class BestModel(bestModel:Option[MatrixFactorizationModel], bestRanks:Int, bestIters:Int, bestLambdas:Double, bestRmse:Double)
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster(config("spark.cores")).setAppName("ALSTrainer")
//创建sparkSession
val spark = SparkSession.builder().config(sparkConf).getOrCreate()
//加载数据,作为rating, rdd需要应用asl
val ratingRDD = getDFFromCass(spark, "cdp", "t_user_item_rating")
.as[ProductRating]
.rdd
.map(
rating => Rating(rating.userId, rating.productId, rating.score)
)
//数据切分为训练集合测试集
val splits = ratingRDD.randomSplit(Array(0.8, 0.2))
val trainingRDD = splits(0)
val testingRDD = splits(1)
//核心实现,输出最优参数
val bestModel = RmseUtil.predictBestRmse(trainingRDD, testingRDD)
println("bestModel" + bestModel.bestRmse)
val itemRecs = recommender(spark, rat

该文详细介绍了如何利用Spark的mllib库实现交替最小二乘(ALS)算法,该算法用于协同过滤,处理用户-商品评分矩阵的缺失值。数据从Cassandra数据库读取,经过训练和测试数据的划分,通过遍历不同的模型参数找到最佳的隐含因子数、迭代次数和惩罚值,以最小化均方误差(RMSE)。最终,ALS模型用于为用户推荐商品,并将结果保存回Cassandra。
最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



