【转载】[协同过滤] : 交替最小二乘法 ALS

本文深入解析了ALS(交替最小二乘)算法,一种广泛应用于推荐系统的矩阵分解方法。文章概述了ALS的基本原理,包括如何通过矩阵分解减少计算复杂度,并利用交替最小二乘法求解未知值。此外,还对比了梯度下降法与最小二乘法的区别,并介绍了ALS在显示反馈与隐式反馈场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://www.cnblogs.com/skyEva/p/5570098.html


写的有点多,我来做个总结和补充:ALS 通过矩阵分解来降低计算量,但是矩阵分解后的大量特征是未知值,通过交替最小二乘法(也就是先假设user矩阵的特征值,通过梯度下降求解item的特征值;再假定item的特征值,求解user的特征值,来完成交替动作)来求解这些未知值,最终得到rating的结果。


注意:梯度下降是求解最小二乘的方法之一,很多人将最小二乘 与 梯度下降等同,这种理解是错误的。详细可以看看ng的视频和度娘


附赠:知乎答案

小二乘法的目标:求误差的最小平方和,对应有两种:线性和非线性。线性最小二乘的解是closed-form即x=(A^T A)^{-1}A^Tb,而非线性最小二乘没有closed-form,通常用迭代法求解。

迭代法,即在每一步update未知量逐渐逼近解,可以用于各种各样的问题(包括最小二乘),比如求的不是误差的最小平方和而是最小立方和。

梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。高斯-牛顿法是另一种经常用于求解非线性最小二乘的迭代法(一定程度上可视为标准非线性最小二乘求解方法)。

还有一种叫做Levenberg-Marquardt的迭代法用于求解非线性最小二乘问题,就结合了梯度下降和高斯-牛顿法。

所以如果把最小二乘看做是优化问题的话,那么梯度下降是求解方法的一种,x=(A^T A)^{-1}A^Tb是求解线性最小二乘的一种,高斯-牛顿法和Levenberg-Marquardt则能用于求解非线性最小二乘。

具体可参考维基百科( Least squares, Gradient descent, Gauss-Newton algorithm, Levenberg-Marquardt algorithm


作者:知乎用户
链接:https://www.zhihu.com/question/20822481/answer/23648885
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


1. 基础回顾

矩阵的奇异值分解 SVD

(特别详细的总结,参考 http://blog.youkuaiyun.com/wangzhiqing3/article/details/7446444)

  • 矩阵与向量相乘的结果与特征值,特征向量有关。
  • 数值小的特征值对矩阵-向量相乘的结果贡献小

1)低秩近似

2)特征降维

相似度和距离度量

(参考 http://blog.sina.com.cn/s/blog_62b83291010127bf.html

2. ALS 交替最小二乘(alternating least squares

在机器学习中,ALS 指使用交替最小二乘求解的一个协同推荐算法。

  • 它通过观察到的所有用户商品打分,来推断每个用户的喜好并向用户推荐适合的商品。

     

每一行代表一个用户(u1,u2,…,u8), 每一列代表一个商品(v1,v2,…,v8),用户的打分为1-9分。

这个矩阵只显示了观察到的打分,我们需要推测没有观察到的打分。

  • ALS的核心就是这样一个假设:打分矩阵是近似低秩的。

换句话说,就是一个m*n的打分矩阵可以由分解的两个小矩阵U(m*k)V(k*n)的乘积来近似,即 A=UVT,k<=m,n 。这就是ALS的矩阵分解方法。

这样我们把系统的自由度从O(mn)降到了O((m+n)k)

  • 低维空间的选取。

这个低维空间要能够很好的区分事物,那么就需要一个明确的可量化目标,这就是重构误差

ALS中我们使用 F范数 来量化重构误差,就是每个元素重构误差的平方和。这里存在一个问题,我们只观察到部分打分,A中的大量未知元是我们想推断的,所以这个重构误差是包含未知数的。

解决方案很简单:只计算已知打分的重构误差。

     

 3. 协同过滤

协同过滤分析用户以及用户相关的产品的相关性,用以识别新的用户-产品相关性。

协同过滤系统需要的唯一信息是用户过去的行为信息,比如对产品的评价信息。

  • 推荐系统依赖不同类型的输入数据,最方便的是高质量的显式反馈数据,它们包含用户对感兴趣商品明确的评价。例如,Netflix收集的用户对电影评价的星星等级数据。
  • 但是显式反馈数据不一定总是找得到,因此推荐系统可以从更丰富的隐式反馈信息中推测用户的偏好。 隐式反馈类型包括购买历史、浏览历史、搜索模式甚至鼠标动作。

4. 显示反馈模型

通过内积 rij = uivj 来预测,另外加入正则化参数 lamda 来预防 过拟合

最小化重构误差:

 

5. 隐式反馈模型

偏好:二元变量 ,它表示用户 对商品 v的偏好

信任度:变量 ,它衡量了我们观察到的信任度

最小化损失函数:

6.  求解:最优化

1)显示和隐式的异同:

  • 显示模型只基于观察到的值;隐式需要考虑不同的信任度,最优化时需要考虑所有可能的u,v

2) 交替最小二乘求解:

即固定 u求 vi+1 再固定 vi+1   ui+1

 

7. 例子

1
2
3
4
5
6
7
8
9
10
import   org.apache.spark.mllib.recommendation. _< br > //处理训练数据
val   data  =   sc.textFile( "data/mllib/als/test.data" )
val   ratings  =   data.map( _ .split( ',' match   {  case   Array(user, item, rate)  = >
   Rating(user.toInt, item.toInt, rate.toDouble)
})
 
// 使用ALS训练推荐模型
val   rank  =   10
val   numIterations  =   10
val   model  =   ALS.train(ratings, rank, numIterations,  0.01 )
  • ALS算法实现于org.apache.spark.ml.recommendation.ALS.scala文件中
  • Rating也在recommendation里面

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值