博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
推荐系统学习笔记之二 基于内容的推荐系统(CBRS)+Collaborative Filtering 协同过滤
阅读量:2287 次
发布时间:2019-05-09

本文共 3391 字,大约阅读时间需要 11 分钟。

基于内容的推荐系统 (CBRS)

首先介绍一下最简单的一个推荐算法模型CBRS。在这个模型中我们用线性回归的基本思路拟合出每个用户对每个电影的评分向量,预测出用户没有评分的电影并进行推荐。

假设我们有4个Users和5个Movies,有一些用户给电影打了分,有一些没有打。电影的评分是从0-5,没有评分的项在表格中将用?来表示。我们设定每个电影有 X1 X2 两个属性,分别是浪漫和动作,并手动给每个电影进行 X1 X2 的设置。

Movies\User User 1 User 2 User 3 User 4 X1 (romance) X2 (action)
Movie 1 5 5 0 0 0.9 0
Movie 2 5 0 1 0.01
Movie 3 4 0 0.99 0
Movie 3 0 0 5 4 0.1 1
Movie 3 0 0 5 0 0.9

接下来引入一些标记:

nu 表示User的数量
nm 表示Movie的数量
r(i,j) 表示User i 是否给 Movie j 评过分,有则=1,无则=0
y(i,j) 表示User i 给 Movie j 的评分
mj 表示User j 评过分的电影总数

我们对以上特征来构建一个线性回归模型的算法,针对每个用户j都有一个 θj 参数向量(可以理解为对电影的各个属性喜爱程度),并用 xi 表示电影i的特征向量。对于用户j对电影i的评分,预测值为 (θj)Txi

根据以上我们可以构建出代价函数Cost function J =

i:r(i,j)=1((θj)Txiy(i,j))2
根据线性回归模型,我们需要最小化代价函数,并加上正则化项:
min12i:r(i,j)=1((θj)Txiy(i,j))2+λ2k=1n(θjk)2
其中 i:r(i,j)表示我们只计算那些用户 j 评过分的电影。在一般的线性回归模型中,误差项和正则项应该都是乘以 1/2m,在这里我们将 m 去掉。并且我们不对方差项
θ0
进行正则化处理。
上面的操作都是对单个用户线性回归模型,对于所有用户,我们有:
minθ1..θnu12j=1nui:r(i,j)=1((θj)Txiy(i,j))2+λ2j=1nuk=1n(θjk)2
如果使用梯度下降来求解,根据Cost function代价函数求偏导可以得出θ的更新公式,其中a表示学习速率:
θjk:=θjkai:r(i,j)=1((θj)Txiy(i,j))xik(k=0)
θjk:=θjka(i:r(i,j)=1((θj)Txiy(i,j))xik+λθjk)(k!=0)

当然此模型可能过于简单,除了每个电影的属性很少,而且人们喜爱一个电影的因素也不只是因为电影的分类,电影的演员,导演,甚至是上映时间都可以成为观众喜爱一部电影的重要因素。

Collaborative Filtering 协同过滤算法

在之前基于内容的推荐系统中,我们必须要有电影的特征向量才能求出每个用户的参数向量,但是这样会带来很大的麻烦,原因是每个人对电影的分类概念都不同,而且需要手动定义每个电影的特征向量将会降低许多效率。

不如我们换个思路,可否通过用户参数向量来拟合出电影的特征向量呢?当然是可以的:

minx1..xnm12i=1nuj:r(i,j)=1((θj)Txiy(i,j))2+λ2i=1nmk=1n(xik)2
和之前作对比两个最小化代价函数都如此相近,那么将用户参数与电影的向量都作为代价函数J的输入值,再分别对x于θ分别求偏导就可以解决实际应用中用户评分与电影特征向量都不全的问题了。
CostFunctionJ(x,θ)=12(i,j):r(i,j)=1((θj)Txiy(i,j))2+λ2i=1nmk=1n(xik)2+λ2j=1nuk=1n(θjk)2
再对x与θ分别求偏导,并用梯度下降求局部最小值
θjk:=θjka(i:r(i,j)=1((θj)Txiy(i,j))xik+λθjk)
xik:=xika(j:r(i,j)=1((θj)Txiy(i,j))θjk+λxik)
注:在协同过滤从算法中,我们通常不使用方差项,如果需要的话,算法会自动学得。

协同过滤算法使用步骤如下:

  1. 初始 x(1),x(2),…,x( nm ),θ(1),θ(2),…,θ( nu )为一些随机小值
  2. 使用梯度下降算法最小化代价函数
  3. 在训练完算法后,我们预测 (θ(j))Tx(i) 为用户 j 给电影 i 的评分从而进行推荐
  • 均值化处理(Mean Normalization)
    现在假设新来了一名用户,她从来没有看过任何电影,我们该如何给该用户推荐电影呢?首先我们可以先得出矩阵Y表示用户与评分:最有一列为该用户的评分
    Y=55?005?4000?05500?40?????
    我们首先需要对结果 Y 矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:
    Y=2.52.5?2.251.252.5?22.251.252.5?22.753.752.52.5?1.751.25?????
    然后我们利用这个新的 Y 矩阵来训练算法。如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测 (θ(j))T(x(i))+μi 对于新用户,我们的新模型会认为她给每部电影的评分都是该电影的平均分。

Matlab代码参考

cofiCostFunc.m

function [J, grad] = cofiCostFunc(params, Y, R, num_users, num_movies, ...                                  num_features, lambda)% Collaborative filtering cost function% Unfold the U and W matrices from paramsX = reshape(params(1:num_movies*num_features), num_movies, num_features);Theta = reshape(params(num_movies*num_features+1:end), ...                num_users, num_features);J = 0;X_grad = zeros(size(X));Theta_grad = zeros(size(Theta));M=(X*Theta'-Y).^2;J=1/2*sum(sum(R.*M));J=J+lambda/2*sum(sum(Theta.^2))+lambda/2*sum(sum(X.^2));for k=1:num_features    for i=1:num_movies           for j=1:num_users               X_grad(i,k)=X_grad(i,k)+(X(i,:)*Theta(j,:)'-Y(i,j))*Theta(j,k).*R(i,j);                                 end            endendX_grad=X_grad+lambda*X;for k=1:num_features    for j=1:num_users        for i=1:num_movies               Theta_grad(j,k)=Theta_grad(j,k)+(X(i,:)*Theta(j,:)'-Y(i,j))*X(i,k).*R(i,j);                                 end            endendTheta_grad=Theta_grad+lambda*Theta;grad = [X_grad(:); Theta_grad(:)];end

转载地址:http://icfnb.baihongyu.com/

你可能感兴趣的文章
6年拉力工作经验,学了阿里P8级架构师的7+1+1落地项目,跳槽阿里年薪直接40W+
查看>>
90天吃透阿里P8推荐的625页Java编程兵书技术实战,直接入职阿里定级P6
查看>>
清华毕业扫地僧,用157集终于把java给讲完了,总计3.13GB
查看>>
清华毕业大佬用了一个项目就把SpringMVC+Spring+MyBatis给讲完了
查看>>
终于学完阿里P8架构师多年实战经验总结分享微服务之道实战文档
查看>>
年薪120W的架构师简历你见过吗?java程序员该如何达到?
查看>>
超赞!80W美团架构师7年心血终成轻量级框架SSM整合开发实战文档
查看>>
超赞!终于学完了阿里P8架构师7年心血整理总结的微服务实战文档
查看>>
真666!阿里资深架构师熬夜纯手写的238页微服务容器化开发实战笔记
查看>>
Mygod!阿里P8架构师20年经验总结成微服务设计企业架构转型之道笔记
查看>>
终于拿到阿里架构师分享的557页深入理解Java模块系统文档笔记,赶紧分享给大家
查看>>
蚂蚁上市延期!还想进阿里做技术专家?这套java面试题送给你
查看>>
终于学完了2021年阿里内部480道全套java面试题及答案
查看>>
面试官:熟悉Redis吗,项目中你是如何对Redis内存进行优化的
查看>>
JVM 实战学习总结:JVM 的分代模型:年轻代、老年代、永久代
查看>>
面试官:聊聊 Spring 中的线程安全性
查看>>
一篇文教你在 Java 中利用 redis 实现分布式全局唯一标识服务
查看>>
深入浅出数据库事务和4种隔离级别
查看>>
对限频限流的思考
查看>>
15天内4面阿里,成功拿下offer,分享个人面经
查看>>