Coursera ML笔记 -----week9-2 推荐系统

欢迎点击作者原文地址

推荐系统

我们想要建立一个推荐系统,有这么两种方法:
1. 基于内容的推荐系统content-based recommendations
2. 协同过滤 collaborative filter

基于内容的推荐系统

我们想做的是我们能够根据用户以往对于电影的评分,来给用户推荐电影。

要实现上面的这个推荐系统,我们要做到两件事情:
1. 建立起一个用户对电影评分的模型
2. 根据用户评分的模型从用户没有看过的电影里面推荐合适的电影给用户

我们在建立用户对电影评分模型的时候,其实是在做两件事情:
1. 判断电影是什么类型的电影(基于内容),也就是获取样本数据 x
2. 在过去的历史中,用户对这一类型的电影给出了什么样的评价,也就是获取用户对不同类型电影的偏好,获取对每个类型评分的权重θ,
(在我们给出的例子而言,我们的样本数据 x 已经直接给出,但是如果我们自己想要获取这样子的数据,我们应该怎么对电影的数据进行处理?)

我们先从单个用户的角度来尝试解决问题,很明显,我们可利用线性回归做预测的手段来对用户没有看过的电影做出评分预测。
我们将评分看作是y,基于内容构建特征向量 (x0,x1,x2) ,其中 x0=1 ,求出对应的 θ
设(电影为行,用户为列)
nu 是用户的数量
nm 是电影的总数
m(j) 是第 j 个用户看的电影数量
r(i,j)表示第 j 个用户是否看过第i部电影
y(i,j) 表示第 j 个用户对第i部电影的评分( r(i,j)=1 )
x(i) 是电影 i 的特征向量,表示第i部电影的电影类型
θ(j) 是用户 j 的参数向量,表示第j个用户对电影的偏好,

那么, 用户 j 对电影x(i)的评分预测就是: (θ(j))Tx(i)
损失函数就是:

J(θ(j))=12m(j)i:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2m(j)i=1n(θ(j)k)212i:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2i=1n(θ(j)k)2

我们的optimization objective就是:
minθ(j)J(θ(j))

推广到多个用户的情况,我们的optimization objective 就是:

minθ(1),...,θ(nu)J(θ(1),...,θ(nu))=minθ(1),...,θ(nu)12j=1nui:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nui=1n(θ(j)k)2

通过上式,我们利用梯度下降法就可以得到 θ(1),...,θ(nu)
θ(j)k:=θ(j)kαi:r(i,j)=1((θ(j))Tx(i)y(i,j))x(i)k  (for k=0)

θ(j)k:=θ(j)kαi:r(i,j)=1((θ(j))Tx(i)y(i,j))x(i)k+λθ(j)k  (for k0)

至此,我们的模型就已经建立完毕。

那么,对于用户没有看过的电影,我们就可以用我们的模型去对电影进行评价,根据每一个用户对该电影的预测评分的高低来决定要不要推荐这部电影给某个用户。

但是我们基于内容的推荐系统有一个很重要的前提就是,我们能够根据内容来提取出特征,也就是获取 x 。但如果很难提取或者提取的成本太大我们要怎么办,这就要用到另外一种方法——协同过滤了。

协同过滤

协同过滤的最大一个特点就是,它可以自动地找到合适的特征!并且在升级款的协同过滤中,xRn,θRn,前面所用到的 x0 和对应的 θ0 都被去掉了,因为如果特征向量中真的有 xi=1 的需求,那么协同过滤会自己去发现这样子的特征,不用我们再硬性制定。

我们这里提到的协同过滤有两个版本:基础款和升级款

基础款

对单部电影,给定 θ(1),...,θ(nu) ,学习参数 x(i)

minx(i)12j:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2k=1n(x(i)k)2

对于所有电影而言,给定 θ(1),...,θ(nu) ,学习参数 x(1),...,x(nm)
minx(1),...,x(nm)12i=1nmj:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2i=1nmk=1n(x(i)k)2

这就是协同过滤,每一个用户在给电影打分时,都有助于算法去寻找到更有效的特征,从而给提升每一个用户的推荐体验。

和前面基于内容的推荐系统相比较,很显然
基于内容的推荐系统是 x(1),...,x(nm) 已知,估计特征 θ(1),...,θ(nu)
协同过滤是 θ(1),...,θ(nu) 已知,估计参数 x(1),...,x(nm)

也就是说我们知道了 θ ,就可以估计 x 。知道了x,也就可以估计 θ
那么在给用户推荐时,我们就有这样子的一个流程:
随机初始化 θ ,然后求 x ,然后求好一点的θ,继续求好一点的 x … … 也就是random initial θxθxθx...

升级款

基础款的协同过滤是要不断来回折腾的,有没有什么办法能够不这么费力呢?这就引入了我们的升级款的协同过滤,能够同时调整 x θ

J(x(1),...,x(nm),θ(1),...,θ(nu))=12(i,j):r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nui=1n(θ(j)k)2+λ2i=1nmk=1n(x(i)k)2

minx(1),...,x(nm)θ(1),...,θ(nu)J(x(1),...,x(nm),θ(1),...,θ(nu))

其中 xRn,θRn

于是我们就有了以下的协同过滤算法:
1. 随机小值初始化x^{(1)},…,x^{(n_m)},\theta^{(1)},…,\theta^{(n_u)}
2. 利用梯度下降法(或其他方法),最小化损失函数 J(x(1),...,x(nm),θ(1),...,θ(nu))
j=1,...,nu,i=1,...,nm

x(i)k:=x(i)kαj:r(i,j)=1((θ(j))Tx(i)y(i,j))θ(j)k+λx(i)kθ(j)k:=θ(j)kαi:r(i,j)=1((θ(j))Tx(i)y(i,j))x(i)k+λθ(j)k

3. 用户 j 对于电影i的评分预测是: (θ(j))Tx(i)

协同过滤的向量实现

YRnm×nu
预测评分结果:

XΘT=(θ(1))T(x(1))(θ(1))T(x(2))(θ(1))T(x(nm))(θ(2))T(x(1))(θ(2))T(x(2))(θ(2))T(x(nm))(θ(nu))T(x(1))(θ(nu))T(x(2))(θ(nu))T(x(nm))

其中
X=(x(1))T(x(2))T(x(nm))T,Θ=(θ(1))T(θ(2))T(θ(nu))T

另外,我们将矩阵 XΘT 叫做Low Rank Matrix (Factorization)

类似产品推荐

主要以产品特征向量之间的距离 x(i)x(j)2 为依据,距离越小,相似度越高!

均值归一化

在进行推荐时,我们可能碰到这样子的一个情况:对于一个新的用户,他没有对任何电影进行评分,我们应该如何进行推荐?
对一个新用户来讲,他的 θ 也是由 minJ 来计算,但是因为这个用户的 r(i,j)=0 ,那么 J 的第一项是没有意义的,那么θ主要就由 λ2nuj=1ni=1(θ(j)k)2 这项决定,也就是要有 minnk=1θ2k 。从而 θk=0 ,此时对于任意一部电影,有 (θ(j))Tx(i)=0 。那这是什么意思呢,就是该用户对所有类型的电影都一视同仁,没有偏好。我们说这样子的人不是不存在,但是我们更多地是希望能够具有一般性。所以,我们要用到均值归一化的手段来对数据 Y 进行预处理。

  1. 我们对评分矩阵Y的每一行取均值 μ ,也就是求每一部电影的所有评分的均值(基于看过的用户数量平均)。

    • Yμ 代替原来的 Y ,代入J进行 Θ,X 的计算。
    • 预测评分: (θ(j))Tx(i)+μ
    • 不过上面的这个步骤略繁琐了,一句话概括就是:用当前看过该电影的用户的评分均值来做为新用户对该电影的预测!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值