ALS交替最小二乘法

第一部分 算法原理及推导

1.1 算法原理介绍

背景介绍:ALS是交替最小二乘的简称,在机器学习上下文中,ALS特指使用交替最小二乘求解的一个协同过滤推荐算法。它通过观察到的所有用户给物品的打分,来推断每个用户的喜好并向用户推荐合适的物品。

核心假设:打分矩阵是近似低秩的,也就是说一个mn阶的打分矩阵 Rmn 可以用两个小矩阵Xkm和 Ykn的乘积来近似,即:

56F7E703-B3F7-403E-818C-8CDAE9C8FAC3.png

其中 k << min(m, n)
假设的合理性:描述一个人的喜好通常是在一个抽象的低维空间进行的,并不需要一一列出其具体喜好的事物,比如说一个人喜欢悬疑类电影,民谣歌曲.....
为了找到使得矩阵X和Y的乘积尽可能地逼近R,采用最小化平方误差损失函数:

28FDFDB0-98A7-42C3-92DB-1ABA9031A7DA.png

其中,rui 表示第u个用户对第 i 个物品的评分,xu (k1阶)表示用户 u 的偏好隐含特征向量 1<= u <= m,yi (k1阶) 表示商品 i 的隐含特征向量 1<= i <= n,用户 u 对物品 i 的评分近似为:

3ABCE5FD-D3E3-47AE-B95A-85CE483F1F22.png

为了防止过拟合,加入正则化项:


E2A998D4-D1C5-465C-B48A-43E8A3B6D49F.png

至此,协同过滤问题转化为一个优化问题,但是由于xu和yi耦合在一起,并不好求解,故引用ALS:先固定Y,由上式求解X,然后再固定求得的X,求解Y,如此交替执行直到误差满足阈值条件或者到达迭代次数上限。

1.2 推导过程

推导过程: 先随机生成Y,固定之,对损失函数L(X, Y)在xu上求偏导,并令其导数=0:

75AB4903-CBCA-44E5-A261-D8D595BDD61F.png

同理,由对称性得:

4A411DEA-B20E-4F7B-8C47-BFF312455F9B.png

1.3 隐式反馈

以上针对显式反馈,对于隐式反馈的情形,损失函数如下:

A208062F-CD5E-4824-8237-2B9E60F5EB8C.png
D8126DCA-C623-4CB2-9376-26760993AA57.png

其中rui表示动作的频率,比如购买、加购物车、收藏、点击的次数,或者观看/收听视频/音频的时长等等,α是置信度系数,cui表示信任度,按照这种方式,我们存在最小限度的信任度,并且随着我们观察到的正偏向的证据越来越多,信任度也会越来越大。
推导过程类似显式反馈的公式推导,结果如下:


74A84B02-8F13-4897-9FC6-FE16213DB085.png

1.4 伪代码

1.4 伪代码
评分矩阵R(mn),最大迭代次数K,均方根误差阈值a,正则化系数lambda
随机初始化X(k
m), Y(kn), i = 0
While i < K and delta>=a
#计算每一个用户的隐含特征向量
for u = 1,2.......m do
#计算中间结果矩阵tmp01
tmp01 = Y
Y.T + lambdaE
#对中间结果矩阵tmp01求逆
tmp02 = tmp01
.I*
#计算中间结果矩阵tmp03
tmp03 = tmp02Y
#计算用户 u 的隐含特征向量, Ru为用户对每个物品的 n 维评分向量
xu = tmp03
Ru
end for
#更新用户隐含特征向量
X(km) = (x1,x2,.....xm)
#计算每一个物品的隐含特征向量
for j = 1,2.......n do
#计算中间结果矩阵tmp01
tmp01 = X
X.T + lambdaE
#对中间结果矩阵tmp01求逆
tmp02 = tmp01
.I*
#计算中间结果矩阵tmp03
tmp03 = tmp02X
#计算物品 j 的隐含特征向量,Rj为所有用户对该物品的 m 维评分向量
yj = tmp03
Rj
end for
#更新物品隐含特征向量
Y(kn) = (y1,y2,.....yn)
#迭代次数 +1
i = i + 1
#计算本次迭代之后实际评分矩阵与X
Y的近似评分矩阵之间的均方根误差
sum = 0
for p =1,2.....m
for q = 1,2,.....n
tmp = Rpq - Xp.TYq
sum = sum + tmp
tmp
delta = sqrt(sum/m*n)
Return X, Y

1.5 预测评分

通过1.3的伪代码实现之后得到Xkm和 Ykn

若预测所有用户对所有物品的评分,即:Predict_All = X(km).T * Y(kn)

若预测某一用户 i 对所有物品的评分,即:Predict_User = X(ki).T * Y(kn)

若预测所有用户对某一物品 j 的评分,即:Predict_User = X(km).T * Y(kj)

若预测某一用户 i 对某一物品 j 的评分,即:Predict_User = X(ki).T * Y(kj)

第二部分 Spark实现

2.1 实现关键点

Spark MLlib实现ALS的关键点:通过合理的分区设计和RDD缓存来减少节点间的数据交换

首先,Spark会将每个用户的评分数据 u 和每个物品的评分数据 v 按照一定的分区策略分区存储,如下图:u1和u2在P1分区,u3在P2分区,v1和v2在Q1分区。

7A4336A0-383E-4E2C-BB33-E291DC493161.png

ALS求解过程中,如通过U求V,在每一个分区中 u 和 v 通过合理的分区设计使得在同一个分区中计算过程可以在分区内进行,无需从其他节点传输数据,生成这种分区结构分两步:

第一步、在P1中将每一个U发送给需要它的Q, 将这种关系存储在该块中,称作OutBlock

第二步、在Q1中需要知道每一个V和哪些U有关联及其对应的打分,这部分数据不仅包含原始打分数据,还包含从每个用户分区收到的向量排序信息,称作InBlock。

所以,从U求解V,我们需要通过用户的OutBlock信息把用户向量发送给物品分区,然后通过物品的InBlock信息构建最小二乘问题并求解。同理,从V求解U,我们需要物品的OutBlock信息和用户的InBlock信息。

对于OutBlock和InBlock只需扫描一次建立好信息并缓存,在以后的迭代计算过程中可以直接计算,大大减少了节点之间的数据传输。

2.3 Spark实现与1.4 伪代码区别

1.4 中的伪代码实现属于单机简化实现,在Spark的MLlib中实现的分布式并行版本所做的主要调整和过程如下:

1、将数据分为若干个区,每个分区都只包含用户和物品的一部分数据块,通过分区实现并行更新用户或者物品的每个隐含特征向量

2、在每个分区中更新隐含特征向量时需要构建最小二乘法的两部分信息,一部分是用户/物品特征矩阵,一部分是用户/物品评分向量;第二部分信息通过2.1中介绍的实现关键点构建用户/物品的InBlock和OutBlock信息获得。

3、 在每一步迭代过程中,每一个分区都会计算所在分区的用户或者物品物品特征向量,然后去更新对应用户或者物品的特征向量,从而实现并行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容