spark
算法原理
协同过滤是用来对用户的兴趣偏好做预测的一种方法。在Spark中实现的是基于潜在因子模型的协同过滤。用户对特定物品的偏好往往可以用评分的形式给出,评分矩阵r的行数对应用户数量,列数对应物品总数,比如以下4个用户对四个电影评分:
本方法的核心在于把评分矩阵分解为用户偏好矩阵(x)和物品偏好因子矩阵(y):
我们的目标是找到最佳的x和y矩阵,使得这两个矩阵相乘时得到的预测矩阵与原始评分矩阵r之间的误差最小。转化为数学描述,就是使得以下目标函数最小化:
该目标函数由两部分构成,前半部分是平方误差,后半部分使用L2正则化,引入 λ 常数,对模型的复杂度进行控制,防止过度拟合训练数据。
Spark使用的是带正则化矩阵分解,优化函数的方式选用的是交叉最小二乘法ALS(alternative least squares),它的一般执行步骤如下:
用随机数初始化物品偏好因子矩阵y
固定y,找到可以最小化目标函数的用户偏好矩阵x
固定x,类同步骤2,找到最小化目标函数的物品偏好因子矩阵y
重复步骤2和3,直到满足算法收敛条件
ALS spark mllib 代码
参数详解:
输入参数名称
数据格式
必填/可选/固定
默认值
取值范围
备注
userCol
String
必填
用户ID
itemCol
String
必填
物品ID
ratingCol
String
必填
用户给物品的评分列
rank
Int
可选
10
≥1
潜在因子数量,最优值需要根据具体数据制定
maxIter
Int
可选
10
≥0
最大循环次数
lambda
Double
可选
0.01
≥0
正则化参数 λ
numUserBlocks
Int
可选
10
≥1
把用户偏好矩阵拆分成小块以满足并行化需求
numItemBlocks
Int
可选
10
≥1
把物品偏好因子矩阵拆分成块以满足并行