简要描述:
- ALS是交替最小二乘(alternating least squares)的简称。在机器学习的范畴中,ALS特指使用交替最小二乘求解的一个协同推荐算法。它通过观察到的所有用户给产品的打分,来推断每个用户的喜好并向用户推荐适合的产品。不过ALS无法准确评估新加入的用户或商品。这个问题也被称为Cold Start问题。
举例如下:
-
ALS推荐算法是基于矩形分解的一种方法。先看看矩阵分解的含义。
-
我们拿电影推荐作为例子。推荐所使用的数据可以抽象成一个[m,n]的矩阵R,R的每一行代表m个用户对所有电影的评分,n列代表每部电影对应的得分。R是个稀疏矩阵,一个用户只是对所有电影中的一小部分看过,有评分。通过矩阵分解方法,我可以把这个低秩的矩阵,分解成两个小矩阵的点乘。公式如下:
image.png
-
矩阵R(评分为1、2、3、4、5):
image.png
-
我把矩阵分解之后,就变成了下面两个小矩阵(F是隐藏特征):
image.png
(用户的特征)
image.png
(电影的特征) -
分解之后的矩阵,变成了根据特征数决定维数的向量。这种求出的向量作为用户的特征,用在推荐上,被成为隐藏特征或者隐藏因子。
-
为什么进行矩阵分解呢?因为推荐使用的矩阵不仅是稀疏的而且往往是低秩的。矩阵分解相当于进行了特征提取或者数据的降维。
-
为了求出两个分解后的矩阵,我可以产生两个维度一样的随机矩阵U和V,点乘之后得到同样m行n列的矩阵R1. 这一步我已经得到两个[m,n]的矩阵,其中一个是反映用户的真实喜好的数据,矩阵R。另一份只是一个近似数据,矩阵R1。我可以找到一个公式来衡量,两个同阶的矩阵的相似程度:
image.png
这是一个损失函数,我的目的就是让这个函数的值最小化,使得我构造的矩阵能够最接近原始矩阵。
ALS算法参数(基于java):
- 关键代码:
MatrixFactorizationModel model = ALS.train(ratings, rank, iterations,lambda);
- 解释:
-
ratings:训练集,数据格式:(用户id 物品id 评分 )
image.png
- rank:矩阵分解时对应的低维的维数,即特征向量维数或者说特征数。如果这个值太小拟合的就会不够,误差就很大;如果这个值很大,就会导致模型大泛化能力较差。这个值会影响矩阵分解的性能,越大则算法运行的时间和占用的内存可能会越多。通常需要进行调参,一般可以取10-200之间的数。
- iterations:在矩阵分解用交替最小二乘法求解时,进行迭代的最大次数。这个值取决于评分矩阵的维度,以及评分矩阵的系数程度。一般来说,不需要太大,比如5-20次即可。
- lambda:正则因子。lambda也是和rank一样的,如果设置很大就可以防止过拟合问题,如果设置很小,其实可以理解为直接设置为0,那么就不会有防止过拟合的功能了;怎么设置呢?可以从0.0001 ,0.0003,0.001,0.003,0.01,0.03,0.1,0.3,1,3,10这样每次大概3倍的设置,先大概看下哪个值效果比较好,然后在那个比较好的值(比如说0.01)前后再设置一个范围,比如(0.003,0.3)之间,间隔设置小点,即0.003,0.005,0.007,0.009,0.011等等等。
-
调优:
需要引入均方根误差(RMSE):均方根误差是用来衡量观测值同真值之间的偏差。 -
用途:预测评分和推荐物品或者用户等。
- 预测用户对物品的评分
predict(int user, int product)
- 预测用户集对物品集的评分
predict(JavaPairRDD<Integer, Integer> usersProducts)
- 推荐用户k个物品
recommendProducts(final int user, int num)
- 对物品推荐k个用户
recommendUsers(final int product, int num)
- 对所有用户推荐物品,物品数量取前k个
recommendProductsForUsers(int num)
- 对所有物品推荐用户,用户数量取前k个
recommendUsersForProducts(int num)
网友评论