没有合适的资源?快使用搜索试试~ 我知道了~
首页使用Spark MLlib给豆瓣用户推荐电影.doc
完整项目链,机器学习到用户推荐,实现精准营销! ALS算法 LS是alternating least squares的缩写 , 意为交替最小二乘法。该方法常用于基于矩阵分解的推荐系统中。例如:将用户(user)对商品(item)的评分矩阵分解为两个矩阵:一个是用户对商品隐含特征的偏好矩阵,另一个是商品所包含的隐含特征的矩阵。在这个矩阵分解的过程中,评分缺失项得到了填充,也就是说我们可以基于这个填充的评分来给用户最商品推荐了。
资源详情
资源评论
资源推荐

炎炎夏日,海量优惠券大放送;即日 起至 8 月 10 日领券即享冰点钜惠价
http://www.roncoo.com/activity/getcoupon
ALS 算法
LS 是 alternating least squares 的缩写 , 意为交替最小二乘法。该方法常用于基于矩阵
分解的推荐系统中。例如:将用户(user)对商品(item)的评分矩阵分解为两个矩阵:一个
是用户对商品隐含特征的偏好矩阵,另一个是商品所包含的隐含特征的矩阵。在这个矩阵
分解的过程中,评分缺失项得到了填充,也就是说我们可以基于这个填充的评分来给用户
最商品推荐了。
由于评分数据中有大量的缺失项,传统的矩阵分解 SVD(奇异值分解)不方便处理这个问
题,而 ALS 能够很好的解决这个问题。对于 R(m×n)的矩阵,ALS 旨在找到两个低维矩阵
X(m×k)和矩阵 Y(n×k),来近似逼近 R(m×n),即:R~=XYR~=XY ,其中 ,
X∈Rm×dX∈Rm×d,Y∈Rd×nY∈Rd×n,d 表示降维后的维度,一般 d<<r,r 表示矩
阵 R 的秩,r<<min(m,n)r<<min(m,n)。
为了找到低维矩阵 X,Y 最大程度地逼近矩分矩阵 R,最小化下面的平方误差损失函数。
L(X,Y)=∑u,i(rui−xTuyi)2L(X,Y)=∑u,i(rui−xuTyi)2
为防止过拟合给公式 (1) 加上正则项,公式改下为:
L(X,Y)=∑u,i(rui−xTuyi)2+λ(|xu|2+ |yi|2)......(2)L(X,Y)=∑u,i(rui−xuTyi)2+λ(|
xu|2+ |yi|2)......(2)
其中 xu∈Rd,yi∈Rdxu∈Rd,yi∈Rd,1⩽u⩽m1⩽u⩽m,1⩽i⩽n1⩽i⩽n,λλ 是正则
项的系数。
MLlib 的实现算法中有以下一些参数:
numBlocks
用于并行化计算的分块个数 (-1 为自动分配)
rank
模型中隐藏因子的个数,也就是上面的 r
iterations
迭代的次数,推荐值:10-20
lambda
惩罚函数的因数,是 ALS 的正则化参数,推荐值:0.01
implicitPrefs
决定了是用显性反馈 ALS 的版本还是用适用隐性反馈数据集的版本
alpha
是一个针对于隐性反馈 ALS 版本的参数,这个参数决定了偏好行为强度的基准

隐性反馈 vs 显性反馈
基于矩阵分解的协同过滤的标准方法一般将用户商品矩阵中的元素作为用户对商品的显性
偏好。 在许多的现实生活中的很多场景中,我们常常只能接触到隐性的反馈(例如游览,
点击,购买,喜欢,分享等等)在 MLlib 中所用到的处理这种数据的方法来源于文献:
Collaborative Filtering for Implicit Feedback Datasets。 本质上,这个方法将数据
作为二元偏好值和偏好强度的一个结合,而不是对评分矩阵直接进行建模。因此,评价就
不是与用户对商品的显性评分而是和所观察到的用户偏好强度关联了起来。然后,这个模
型将尝试找到隐语义因子来预估一个用户对一个商品的偏好。
以上的介绍带着浓重的学术气息,需要阅读更多的背景知识才能了解这些算法的奥秘。
Spark MLlib 为我们提供了很好的协同算法的封装。 当前 MLlib 支持基于模型的协同过滤
算法,其中 user 和 product 对应上面的 user 和 item,user 和 product 之间有一些隐藏
因子。MLlib 使用 ALS(alternating least squares)来学习/得到这些潜在因子。
下面我们就以实现一个豆瓣电影推荐系统为例看看如何使用 Spark 实现此类推荐系统。以
此类推,你也可以尝试实现豆瓣图书,豆瓣音乐,京东电器商品推荐系统。
豆瓣数据集
一般学习 Spark MLlib ALS 会使用 movielens
数据集。这个数据集保存了用户对电影的
评分。
但是这个数据集对于国内用户来说有点不接地气,事实上国内有一些网站可以提供这样的
数据集,比如豆瓣,它的人气还是挺高的。
但是豆瓣并没有提供这样一个公开的数据集,所以我用抓取了一些数据做测试。
数据集分为两个文件:
hot_movies.csv: 这个文件包含了热门电影的列表,一种 166 个热门电影。格式
为 评分电影名,如
[XML]纯文本查看 复制代码
小王子
垫底辣妹
海绵宝宝
突然变异
烈日迷踪
侦探:为了
原点
user_movies.csv: 这 个 文 件 包 含 用 户 对 热 门 电 影 的 评 价 , 格 式 为
评分

[XML]纯文本查看 复制代码
!!
"#$%
&'(
")% *%
!%*'
可以看到,用户名并不完全是整数类型的,但是 MLlib ALS 算法要求 user,product 都是
整型的,所以我们在编程的时候需要处理一下。
有些用户只填写了评价,并没有打分,文件中将这样的数据记为-1。在 ALS 算法中,把它
转换成 3.0,也就是及格 60 分。虽然可能和用户的实际情况不相符,但是为了简化运算,
我在这里做了简化处理。
用户的评分收集了大约 100 万条,实际用户大约 22 万。这个矩阵还是相当的稀疏。
注意这个数据集完全基于豆瓣公开的网页,不涉及任何个人的隐私。
模型实现
本系统使用 Scala 实现。
首先读入这两个文件,得到相应的弹性分布数据集 RDD (第 7 行和第 8 行)。
[Scala]纯文本查看 复制代码
object+"%&(% +,
--def+%.*:+/'01%*2:+3%1+=+
,
----val+(+=+new+04#5%161.new+
04#5%7.21/448.9"%&(%
922
----::)+"++9:41: "%:9
----val+"+=+if+.*)%*1;++2+
*.2+else+9:41: "%:9
----::获取 &
----val+!3<1+=+
(161=)."+>+9$(92
----val+!?1<1+=+
(161=)."+>+9;1$(92
----::准备数据
----441%.!3<1+
!?1<12
----4%1)%.9准备完数据92
---- ).(+!3<1+
剩余13页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0