前言

spark平台推出至今已经地带到2.1的版本了,很多地方都有了重要的更新,加入了很多新的东西。但是在协同过滤这一块却一直以来都只有ALS一种算法。同样是大规模计算平台,Hadoop中的机器学习算法库Mahout就集成了多种推荐算法,不但有user-cf和item-cf这种经典算法,还有KNN、SVD,Slope one这些,可谓随意挑选,简繁由君。我们知道得是,推荐系统这个应用本身并没有过时,那么spark如此坚定 地只维护一个算法,肯定是有他的理由的,让我们来捋一捋。
ALS算法

ALS的意思是交替最小二乘法(Alternating Least Squares),它只是是一种优化算法的名字,被用在求解spark中所提供的推荐系统模型的最优解。spark中协同过滤的文档中一开始就说了,这是一个基于模型的协同过滤(model-based CF),其实它是一种近几年推荐系统界大火的隐语义模型中的一种。隐语义模型又叫潜在因素模型,它试图通过数量相对少的未被观察到的底层原因,来解释大量用户和产品之间可观察到的交互。操作起来就是通过降维的方法来补全用户-物品矩阵,对矩阵中没有出现的值进行估计。基于这种思想的早期推荐系统常用的一种方法是SVD(奇异值分解)。该方法在矩阵分解之前需要先把评分矩阵R缺失值补全,补全之后稀疏矩阵R表示成稠密矩阵R',然后将R’分解成如下形式:

R' = UTSV
然后再选取U中的K列和V中的S行作为隐特征的个数,达到降维的目的。K的选取通常用启发式策略。
这种方法有两个缺点,第一是补全成稠密矩阵之后需要耗费巨大的存储空间,在实际中,用户对物品的行为信息何止千万,对这样的稠密矩阵的存储是不现实的;第二,SVD的计算复杂度很高,更不用说这样的大规模稠密矩阵了。所以关于SVD的研究很多都是在小数据集上进行的。
隐语义模型也是基于矩阵分解的,但是和SVD不同,它是把原始矩阵分解成两个矩阵相乘而不是三个。
A = XYT
现在的问题就变成了确定X和Y ,我们把X叫做用户因子矩阵,Y叫做物品因子矩阵。通常上式不能达到精确相等的程度,我们要做的就是要最小化他们之间的差距,从而又变成了一个最优化问题。求解最优化问题我们很容易就想到了随机梯度下降,其中有一种方法就是这样,通过优化如下损失函数来找到X和Y中合适的参数:

 

其中puk就是X矩阵中u行k列的参数,度量了用户u和第k个隐类的关系;qik是Y矩阵中i行k列的参数,度量了物品i和第k个隐类的关系。这种方式也是一种很流行的方法,有很多对它的相关扩展,比如加上偏置项的LFM。
然而ALS用的是另一种求解方法,它先用随机初始化的方式固定一个矩阵,例如Y
然后通过最小化等式两边差的平方来更新另一个矩阵X,这就是“最小二乘”的由来。得到X之后,又可以固定X用相同的方法求Y,如此交替进行,直到最后收敛或者达到用户指定的迭代次数为止,是为“交替”是也。 从上式可以看出,X的第i行是A的第i行和Y的函数,因此可以很容易地分开计算X的每一行,这就为并行就算提供了很大的便捷,也正是如此,Spark这种面向大规模计算的平台选择了这个算法。在3这篇文章中,作者用了embarrassingly parallel来形容这个算法,意思是高度易并行化的——它的每个子任务之间没有什么依赖关系。
在现实中,不可能每个用户都和所有的物品都有行为关系,事实上,有交互关系的用户-物品对只占很小的一部分,换句话说,用户-物品关系列表是非常稀疏的。和SVD这种矩阵分解不同,ALS所用的矩阵分解技术在分解之前不用把系数矩阵填充成稠密矩阵之后再分解,这不但大大减少了存储空间,而且spark可以利用这种稀疏性用简单的线性代数计算求解。这几点使得本算法在大规模数据上计算非常快,解释了为什么spark mllib目前只有ALS一种推荐算法。
显性反馈和隐性反馈


我们知道,在推荐系统中用户和物品的交互数据分为显性反馈和隐性反馈数据的。在ALS中这两种情况也是被考虑了进来的,分别可以训练如下两种模型:
  1. val model1 = ALS.train(ratings, rank, numIterations, lambda)//显性反馈模型
  2. val model2 = ALS.trainImplicit(ratings, rank, numIterations, lambda, alpha)//隐性反馈模型
参数:
rating:由用户-物品矩阵构成的训练集
rank:隐藏因子的个数
numIterations: 迭代次数

lambda:正则项的惩罚系数
alpha: 置信参数
从上面可以看到,隐式模型多了一个置信参数,这就涉及到ALS中对于隐式反馈模型的处理方式了——有的文章称为“加权的正则化矩阵分解”,它的损失函数如下:
我们知道,在隐反馈模型中是没有评分的,所以在式子中rui被pui所取代,pui是偏好的表示,仅仅表示用户和物品之间有没有交互,而不表示评分高低或者喜好程度。比如用户和物品之间有交互就让pui等于1,没有就等于0。函数中还有一个cui的项,它用来表示用户偏爱某个商品的置信程度,比如交互次数多的权重就会增加。如果我们用dui来表示交互次数的话,那么就可以把置信程度表示成如下公式:
这里的alpha就是上面提到的置信参数,也是这个模型的超参数之一,需要用交叉验证来得到。
用spark的ALS模型进行推荐

1.为指定用户进行topN推荐
  1. model.recommendProducts(userID, N)
2.为 用户-物品 对进行预测评分,显式和隐式反馈都可以,是根据两个因子矩阵对应行列相乘得到的数值,可以用来评估系统。既可以传入一对参数,也可以传入以(user,item)对类型的RDD对象作为参数,如下

  1. model.predict(user, item)
  2. model.predict(RDD[int, int])
3.根据物品推荐相似的物品
这其实不算是一种模型内置的推荐方式,但是ALS可以为我们计算出物品因子矩阵和用户因子矩阵:
  1. model.productFeatures
  2. model.userFeatures
这是一种降维,让我们可以用更少的维度表示,同时也意味着如果我们要算物品相似度或者用户相似度可以用更少的特征进行计算。进而得到“和这个物品相似的物品”这种类型的推荐。
参考资料

1.《spark机器学习》

2.《spark高级数据分析》
3.Intro to Implicit Matrix Factorization: Classic ALS with Sketchfab Models

spark中的ALS相关推荐

  1. Spark中组件Mllib的学习11之使用ALS对movieLens中一百万条(1M)数据集进行训练,并对输入的新用户数据进行电影推荐

    更多代码请见:https://github.com/xubo245/SparkLearning 1解释 spark-1.5.2 数据集:http://grouplens.org/datasets/mo ...

  2. Spark中常用的算法

    Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要 ...

  3. spark中累加器的使用(转)

    环境: ubuntu16.04 64 伪分布式 使用的spark是2.3.1 scala 2.11.8 参考连接: https://blog.csdn.net/android_xue/article/ ...

  4. spark使用之ALS版本对比

    hi各位大佬好,我是菜鸟小明哥,最近在搞spark的破事,别人一问只会pyspark有点low,因此有必要学习下java-spark,以ALS为例开展,毕竟也是推荐中常用的方法,这个有必要知道. 疑问 ...

  5. Spark中的内存计算是什么?

    由于计算的融合只发生在 Stages 内部,而 Shuffle 是切割 Stages 的边界,因此一旦发生 Shuffle,内存计算的代码融合就会中断. 在 Spark 中,内存计算有两层含义: 第一 ...

  6. Java查询spark中生成的文件_java+spark-sql查询excel

    Spark官网下载Spark 下载Windows下Hadoop所需文件winutils.exe 同学们自己网上找找吧,这里就不上传了,其实该文件可有可无,报错也不影响Spark运行,强迫症可以下载,本 ...

  7. Spark中Task,Partition,RDD、节点数、Executor数、core数目(线程池)、mem数

    Spark中Task,Partition,RDD.节点数.Executor数.core数目的关系和Application,Driver,Job,Task,Stage理解 from:https://bl ...

  8. 解决spark中遇到的数据倾斜问题

    一. 数据倾斜的现象 多数task执行速度较快,少数task执行时间非常长,或者等待很长时间后提示你内存不足,执行失败. 二. 数据倾斜的原因 常见于各种shuffle操作,例如reduceByKey ...

  9. 理解spark中的job、stage、task

    什么是Spark? Spark是处理大数据常用的计算引擎.Spark是一个用来实现快速而通用的集群计算的平台.扩展了广泛使用的MapReduce计算模型,而且高效地支持更多的计算模式,包括交互式查询和 ...

最新文章

  1. Linux-sort排序
  2. dd linux 尾部添加0_Linux文件目录命令整理Linux学习
  3. 3.认识和操作一下mysql的基本命令
  4. 职场中必需修炼的七项意识
  5. 开发基于深度学习的人脸识别【考勤/签到】系统
  6. Java如何判断整数溢出,溢出后怎么得到提示?
  7. 基于链表的学生成绩最高分计算问题计算用c语言编写课程设计,C语言程序设计课程设计-基于链表的学生成绩管理系统.doc...
  8. Git详解(2)——Git基础
  9. matlab 外接圆,【外接圆matlab知道三个顶点的坐标,如何求这三个顶点组成的三角形外接圆的半径与圆心坐标?】作业帮...
  10. UA MATH564 概率论 概率不等式
  11. 什么是网络爬虫?爬虫有什么好处?
  12. vb 复制 剪贴板 html,VB.NET中调用系统的剪贴板完成数据的复制和粘贴
  13. 什么是iBeacon?
  14. python编程求长方形的面积_python实现用类读取文件数据并计算矩形面积
  15. WebRTC实时通信系列教程7 使用Socket.IO搭建信令服务器交换信息
  16. 美团机器学习——特征工程
  17. 边缘之战鸣枪 新华三蓄势待发
  18. 统计学 假设检验 P值
  19. 热销超极本iFunk翼S到底怎么样?
  20. 数字签名、证书,RSA加密、解密

热门文章

  1. android ndk使用c 11,使用c 11 std :: async在android ndk中使用不完整类型无效
  2. python读取mysql数据_如何将mysql的数据读取python
  3. javascript--弹出对话框 四种对话框 获得用户输入值 .
  4. java传统的项目有哪些内容_请问java全套内容都有什么呢?
  5. java静态多态_Java静态方法不具有多态性详解
  6. python某行某列读取数据_使用scrpython从某行的第一列提取数据
  7. kubernetes英语怎么读_陷阱英语单词怎么读?
  8. js if判断多个条件_EXCEL一对多条件查找显示多个结果(INDEX+SMALL+IF+ROW函数组合)...
  9. linux界面版admin,linux下Nginx+Django Admin界面无样式问题解决方法
  10. 华为新系统鸿蒙有哪些手机_华为鸿蒙OS系统传来新消息!外媒宣布:未来几年内华为手机都将无缘...