11.5.5 协同过滤与推荐
协同过滤是一种根据用户对各种产品的交互与评分来推荐新产品的推荐系统技术。
协同过滤吸引人的地方就在于它只需要输入一系列用户 / 产品的交互记录:
无论是“显式”的交互(例如在购物网站上进行评分)还是“隐式”的(例如用户访问了一个产品的页面但是没有对产品评分)交互皆可。
仅仅根据这些交互,协同过滤算法就能够知道哪些产品之间比较相似(因为相同的用户与它们发生了交互)以及哪些用户之间比较相似,然后就可以作出新的推荐。
交替最小二乘
MLlib 中包含交替最小二乘(简称 ALS)的一个实现,这是一个协同过滤的常用算法,可以很好地扩展到集群上。
它位于 mllib.recommendation.ALS 类中。
ALS 会为每个用户和产品设一个特征向量,这样用户向量与产品向量的点积就接近于他们的得分。
它接收下面所列这些参数。
-
rank
使用的特征向量的大小;更大的特征向量会产生更好的模型,但是也需要花费更大的计 算代价(默认值: 10 )。 - iterations
要执行的迭代次数(默认值: 10 )。 - lambda
正则化参数(默认值: 0.01 )。 - alpha
用来在隐式 ALS 中计算置信度的常量(默认值: 1.0 )。 - numUserBlocks , numProductBlocks
切分用户和产品数据的块的数目,用来控制并行度;你可以传递 -1 来让 MLlib 自动决定(默认行为)。
要使用 ALS 算法,你需要有一个由 mllib.recommendation.Rating 对象组成的 RDD,其中每个包含一个用户 ID、一个产品 ID 和一个评分(要么是显式的评分,要么是隐式反馈)。
ALS 返回一个 MatrixFactorizationModel 对象来表示结果,可以调用 predict() 来对一个由(userID, productID) 对组成的 RDD 进行预测评分。
也可以使用 model.recommendProducts userId, numProducts) 来为一个给定用户找到最值得推荐的前 numProduct 个产品。
ALS 有两个变种:
-
显式评分(默认情况)
用于显式评分时,每个用户对于一个产品的评分需要是一个得分(例如 1 到 5 星),而预测出来的评分也是得分。 -
隐式反馈(通过调用 ALS.trainImplicit()而非 ALS.train() 来打开)
用于隐式反馈时,每个评分代表的是用户会和给定产品发生交互的置信度(比如随着用户访问一个网页次数的增加,评分也会提高),预测出来的也是置信度。