ALS算法是2008年以来,用的比较多的协同过滤算法。它已经集成到Spark的Mllib库中,使用起来比较方便。

从协同过滤的分类来说,ALS算法属于User-Item CF,也叫做混合CF。它同时考虑了User和Item两个方面。

用户和商品的关系,可以抽象为如下的三元组:<User,Item,Rating>。其中,Rating是用户对商品的评分,表征用户对该商品的喜好程度。

ALS算法是基于模型的推荐算法。起基本思想是对稀疏矩阵进行模型分解,评估出缺失项的值,以此来得到一个基本的训练模型。然后依照此模型可以针对新的用户和物品数据进行评估。ALS是采用交替的最小二乘法来算出缺失项的。交替的最小二乘法是在最小二乘法的基础上发展而来的。

假设我们有一批用户数据,其中包含m个User和n个Item,则我们定义Rating矩阵,其中的元素表示第u个User对第i个Item的评分。

一般情况下,k的值远小于n和m的值,从而达到了数据降维的目的。在实际使用中,由于n和m的数量都十分巨大,因此R矩阵的规模很容易就会突破1亿项。这时候,传统的矩阵分解方法对于这么大的数据量已经是很难处理了。

另一方面,一个用户也不可能给所有商品评分,因此,R矩阵注定是个稀疏矩阵。矩阵中所缺失的评分,又叫做missing item。

针对这样的特点,我们可以假设用户和商品之间存在若干关联维度(比如用户年龄、性别、受教育程度和商品的外观、价格等),我们只需要将R矩阵投射到这些维度上即可。这个投射的数学表示是:

这里的表明这个投射只是一个近似的空间变换。一般情况下,k的值远小于n和m的值,从而达到了数据降维的目的。

幸运的是,我们并不需要显式的定义这些关联维度,而只需要假定它们存在即可,因此这里的关联维度又被称为Latent factor。k的典型取值一般是20~200。

这种方法被称为概率矩阵分解算法(probabilistic matrix factorization,PMF)。ALS算法是PMF在数值计算方面的应用。

为了使低秩矩阵X和Y尽可能地逼近R,需要最小化下面的平方误差损失函数:

考虑到矩阵的稳定性问题,使用Tikhonov regularization,则上式变为:

优化上式,得到训练结果矩阵。预测时,将User和Item代入,即可得到相应的评分预测值。

同时,矩阵X和Y,还可以用于比较不同的User(或Item)之间的相似度,如下图所示

ALS算法的缺点在于:

1.它是一个离线算法。

2.无法准确评估新加入的用户或商品。这个问题也被称为Cold Start问题。

ALS算法优化过程的推导


隐式反馈

用户给商品评分是个非常简单粗暴的用户行为。在实际的电商网站中,还有大量的用户行为,同样能够间接反映用户的喜好,比如用户的购买记录、搜索关键字,甚至是鼠标的移动。我们将这些间接用户行为称之为隐式反馈(implicit feedback),以区别于评分这样的显式反馈(explicit feedback)。

隐式反馈有以下几个特点:

1.没有负面反馈(negative feedback)。用户一般会直接忽略不喜欢的商品,而不是给予负面评价。

2.隐式反馈包含大量噪声。比如,电视机在某一时间播放某一节目,然而用户已经睡着了,或者忘了换台。

3.显式反馈表现的是用户的喜好(preference),而隐式反馈表现的是用户的信任(confidence)。比如用户最喜欢的一般是电影,但观看时间最长的却是连续剧。大米购买的比较频繁,量也大,但未必是用户最想吃的食物。

4.隐式反馈非常难以量化。

http://www.jos.org.cn/1000-9825/4478.htm


Spark中ALS的实现原理

Spark利用交换最小二乘解决矩阵分解问题分两种情况:数据集是显式反馈和数据集是隐式反馈。隐式反馈算法的原理是在显示反馈算法原理的基础上作一定的修改,所以在此我们只会具体讲解数据集为隐式反馈的算法。
推荐系统依赖不同类型的输入数据,最方便的是高质量的显式反馈数据,它们包含用户对感兴趣商品明确的评价。例如,大众点评中对餐厅的评价数据,但是显式反馈数据不一定总是找得到。好在推荐系统还可以从更丰富的隐式反馈信息中推测用户的偏好。隐式反馈类型包括购买历史、浏览历史、搜索模式甚至鼠标动作。例如,反复浏览某一个类型理财产品的用户可能喜欢这类理财产品。
了解隐式反馈的特点非常重要,因为这些特质使我们避免了直接调用基于显式反馈的算法。最主要的特点有如下几种:
(1)没有负反馈。通过观察用户行为,我们可以推测那个商品他可能喜欢,然后购买,但是我们很难推测哪个商品用户不喜欢。这在显式反馈算法中并不存在,因为用户明确告诉了我们他喜欢什么他不喜欢什么。
(2)隐式反馈是内在的噪音。虽然我们拼命的追踪用户行为,但是我们仅仅只是猜测他们的偏好和真实动机。例如,我们可能知道一个人的购买行为,但是这并不能完全说明偏好和动机,因为这个商品可能作为礼物被购买而用户并不喜欢它。
(3)显示反馈的数值表示偏好(preference),隐式回馈的数值表示信任(confidence)。
基于显示反馈的系统用星星等级让用户表达他们的喜好程度,例如一颗星表示很不喜欢,五颗星表示非常喜欢。基于隐式反馈的数值描述的是动作的频率,例如用户购买特定商品的次数。一个较大的值并不能表明更多的偏爱。但是这个值是有用的,它描述了在一个特定观察中的信任度。一个发生一次的事件可能对用户偏爱没有用,但是一个周期性事件更可能反映一个用户的选择。
(4)评价隐式反馈推荐系统需要合适的手段。
3.1显式反馈模型
潜在因素模型由一个针对协同过滤的交替方法组成,它以一个更加全面的方式发现潜在特征来解释观察的ratings数据。我们关注的模型由奇异值分解(SVD)推演而来。一个典型的模型将每个用户u(包含一个用户-因素向量ui)和每个商品v(包含一个用户-因素向量vj)联系起来。预测通过内积rij=(uiT)vj来实现。另一个需要关注的地方是参数估计。许多当前的工作都应用到了显式反馈数据集中,这些模型仅仅基于观察到的rating数据直接建模,同时通过一个适当的正则化来避免过拟合。公式如下:
在上述公式中,lambda是正则化的参数。正规化是为了防止过拟合的情况发生。这样,我们用最小化重构误差来解决协同推荐问题。我们也成功将推荐问题转换为了最优化问题。
3.2隐式反馈模型
在显式反馈的基础上,我们需要做一些改动得到我们的隐式反馈模型。首先,我们需要形式化由rij变量衡量的信任度的概念。我们引入了一组二元变量pj,它表示用户u对商品v的偏好。pj的公式如下:
另外,用户购买一个商品也并不一定是用户喜欢它。因此我们需要一个新的信任等级来显示用户偏爱某个商品。一般情况下,rij越大,越能暗示用户喜欢某个商品。因此,我们引入了一组变量Cj,它衡量了我们观察到pj的信任度。C_j一个合理的选择如下所示:
按照这种方式,我们存在最小限度的信任度,并且随着我们观察到的正偏向的证据越来越多,信任度也会越来越大。
我们的目的是找到用户向量以及商品向量vj来表明用户偏好。这些向量分别是用户因素(特征)向量和商品因素(特征)向量。本质上,这些向量将用户和商品映射到一个公用的隐式因素空间,从而使它们可以直接比较。这和用于显式数据集的矩阵分解技术类似,但是包含两点不一样的地方:(1)我们需要考虑不同的信任度。
(2)最优化需要考虑所有可能的u,v对,而不仅仅是和观察数据相关的u,v对。

推荐系统之ALS算法详解相关推荐

  1. 基于协同过滤算法的电影推荐系统设计(二) - ALS算法详解

    0 系列文章目录 0.1 基于协同过滤算法的电影推荐系统设计(一) - 项目简介 0.2 基于协同过滤算法的电影推荐系统设计(二) - 推荐系统介绍 ALS是alternating least squ ...

  2. 推荐系统之LFM算法详解

    个性化召回 召回:从item中选取一部分作为候选集 1)不同的用户喜欢不同的item 2)部分作为候选集,降低系统的负担 根据用户的属性行为上下文等信息从物品全集中选取其感兴趣的物品作为候选集:召回的 ...

  3. 推荐系统简介+算法详解+项目介绍

    目录标题 推荐系统简介 1.推荐系统目的 2.推荐系统的应用 3.推荐系统的基本思想 4.推荐系统的数据分析 5.推荐系统的分类 6.推荐算法简介 6.1 基于人口统计学的推荐算法(基于用户数据) 6 ...

  4. 推荐系统之DIN代码详解

    推荐系统之DIN代码详解 import sys sys.path.insert(0, '..') import numpy as np import torch from torch import n ...

  5. 基于内容的推荐算法详解+问题思考

    前言 最近参加了一个推荐的比赛,就像了解一些推荐相关的技术,也跟着学习总结一下,相同的内容不同的理解,我也要记录下我的思考. 场景 我们假设一个电商的场景,电商有很多商品,怎么把商品推荐给用户 就是我 ...

  6. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

  7. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  8. C++中的STL算法详解

    1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...

  9. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  10. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

最新文章

  1. 数据浪潮上的IP雄鹰
  2. aws php mysql,AWS快速搭建nginx+php+mysql
  3. 继电器rc吸收电路取值_继电器的工作原理以及驱动电路解析
  4. ASP.NET Core Docker Nginx分权,多网站部署
  5. 输入网址后发生了什么
  6. MySQL删除命令_DELETE
  7. WooCommerce税收入门指南,第2部分
  8. android 计步器acc,基于加速度的门限检测计步算法设计
  9. Unity3D插件 Puppet3D的使用
  10. Review Board了解
  11. did拼接屏最小拼缝0.88mm
  12. 合同原件、传真件、扫描件法律效力解析
  13. 联想用u盘重装系统步骤_用u盘给联想笔记本装系统
  14. Linux环境变量PSI指什么,psi是什么单位?
  15. 基于无监督深度学习的单目深度和自身运动轨迹估计的深度神经模型
  16. 学习CSS3,使用双旋转实现福到了的迎春喜庆特效
  17. 【NG-ZORRO、Angular】日期选择框时间段nz-range-picker设置开始结束时间00:00:00~23:59:59
  18. 再见 xxl-job!更强大的新一代分布式任务调度框架来了!
  19. 项目1在线交流平台-4. 使用radis高性能储存方案-1.redis入门-特点、安装与支持数据类型
  20. Vue页面偶尔样式错乱,刷新即恢复

热门文章

  1. CryptoJS 加解密类库的简单用法
  2. cbc cryptojs 前后端_前端加密JS库--CryptoJS 使用指南
  3. 关于MeScroll的下拉刷新,上拉加载的js框架的学习和使用
  4. 使用Easy CHM工具对文件生成API文档
  5. 15个超级实用web开发实用工具
  6. qt QDir 枚举类型
  7. 462计算机连接错误,金蝶K3始终462错误,怎么处理???????
  8. CDA数据分析师教材与题库
  9. 模2加法,模2减法,模2除法
  10. 巫师3储物箱在哪_巫师三孤岩宝箱在哪 | 手游网游页游攻略大全