Spark MLlib中实现ALS协同过滤推荐算法的库为recommendation.py,这可库有以下三个类
__all__ = ['MatrixFactorizationModel', 'ALS', 'Rating']
-a. Rating 算法的输入,包括用户对物品的评价,为三元组
class Rating(namedtuple("Rating", ["user", "product", "rating"]))
user、producet整型数据,通常使用ID表示
rating数值型(double)数据
-b. ALS
这就是算法的实现类,有两个函数,分别对显式反馈和隐式反馈评价:
- 显式反馈
ALS.train(ratings, rank, iterations=5, lambda_=0.01, blocks=-1, nonnegative=False, seed=None)
ratings:ratings: RDD[Rating], 通过Rating函数转换够的需要训练的数据集
rank:特征数目,模型中隐藏因子数,参考设置在10 - 20
iterations=5 : 迭代次数,默认5,一般设置在10-20次
lambda: Double型, ALS中的正则化参数,默认0.01
blocks: Int, 并行计算的block数(-1为自动配置),hadoop集群中默认一个block为128m。
nonnegative=False:是否非负
seed: Long 加载矩阵的随机数
- 隐式反馈
def trainImplicit(cls, ratings, rank, iterations=5, lambda_=0.01, blocks=-1, alpha=0.01, nonnegative=False, seed=None)
比显示反馈多了一个 alpha=0.01参数(ALS隐式反馈变化率),表示置信度,用于控制每次拟合修正的幅度。
-c. MatrixFactorizationModel:矩阵因子分解模型
使用ALS算法针对数据集训练得到模型,本质就是获取两个因子矩阵:
def userFeatures(self): - 用户特征因子矩阵
"""
Returns a paired RDD, where the first element is the user and the
second is an array of features corresponding to that user.
"""
return self.call("getUserFeatures").mapValues(lambda v: array.array('d', v))
def productFeatures(self): - 物品特征因子矩阵
"""
Returns a paired RDD, where the first element is the product and the
second is an array of features corresponding to that product.
"""
return self.call("getProductFeatures").mapValues(lambda v: array.array('d', v))
def predict(self, user, product): - 预测用户对物品的评分
"""
Predicts rating for the given user and product.
"""
return self._java_model.predict(int(user), int(product))
- 推荐
- 为用户推荐物品
def recommendProducts(self, user, num)
- 为物品推荐用户
def recommendUsers(self, product, num)