协同过滤(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