协同过滤(CF)算法(基于spark)

协同过滤(CF)是一种推荐算法,spark中采用的是矩阵分解求ALS(alternating least squares交替最小二乘)的实现。
spark推荐算法在org.apache.spark.mllib.recommendation包下,共有三个类:

Rating:

封装用户id,物品id,评分的数据结构,没有其他接口。

new Rating(user: Int, product: Int, rating: Double)

ALS:

根据输入的RDD[Rating]数据和配置的参数训练模型。具体参数如下:

1) ratings : 评分矩阵对应的RDD。需要我们输入。如果是隐式反馈,则是评分矩阵对应的隐式反馈矩阵。
2) rank : 矩阵分解时对应的低维的维数。这个值越大则算法运行的时间和占用的内存越多。通常需要进行调参,一般可以取10-200之间的数。
3) iterations :在矩阵分解用交替最小二乘法求解时,进行迭代的最大次数。一般来说,不需要太大,比如5-20次即可。默认值是10。
4) lambda: 这个值即为FunkSVD分解时对应的正则化系数。主要用于控制模型的拟合程度,增强模型泛化能力。取值越大,则正则化惩罚越强。大型推荐系统一般需要调参得到合适的值。
5) alpha : 这个参数仅仅在使用隐式反馈trainImplicit时有用。指定了隐式反馈信心阈值,这个值越大则越认为用户和他没有评分的物品之间没有关联。一般需要调参得到合适值。

MatrixFactorizationModel:

最终模型,包含预测和推荐的一些常用方法。

//计算usersProducts中每个(user, product)的评分
predict(usersProducts: RDD[(Int, Int)]): RDD[Rating]

//计算user用户对product的评分
predict(user: Int, product: Int): Double

//为user推荐num个产品
recommendProducts(user: Int, num: Int): Array[Rating]

//把product推荐给num个用户
recommendUsers(product: Int, num: Int): Array[Rating]

//为每个用户进行推荐,每用户推荐num个产品
recommendProductsForUsers(num: Int): RDD[(Int, Array[Rating])]

//推荐每个产品,将每个产品推荐给num个用户
recommendUsersForProducts(num: Int): RDD[(Int, Array[Rating])]

val rank: Int //此模型特征维度
val productFeatures: RDD[(Int, Array[Double])]  //RDD[(产品, 产品特征数组)]
val userFeatures: RDD[(Int, Array[Double])]	//RDD[(用户, 用户特征数组)]

关于矩阵分解的相关数学基础知识,参考:
http://www.cnblogs.com/pinard/p/6251584.html
http://www.cnblogs.com/pinard/p/6351319.html

posted @ 2018-12-23 00:30  xuejianbest  阅读(563)  评论(0编辑  收藏  举报