本文共 3391 字,大约阅读时间需要 11 分钟。
首先介绍一下最简单的一个推荐算法模型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 =
当然此模型可能过于简单,除了每个电影的属性很少,而且人们喜爱一个电影的因素也不只是因为电影的分类,电影的演员,导演,甚至是上映时间都可以成为观众喜爱一部电影的重要因素。
在之前基于内容的推荐系统中,我们必须要有电影的特征向量才能求出每个用户的参数向量,但是这样会带来很大的麻烦,原因是每个人对电影的分类概念都不同,而且需要手动定义每个电影的特征向量将会降低许多效率。
不如我们换个思路,可否通过用户参数向量来拟合出电影的特征向量呢?当然是可以的:协同过滤算法使用步骤如下:
- 初始 x(1),x(2),…,x( nm ),θ(1),θ(2),…,θ( nu )为一些随机小值
- 使用梯度下降算法最小化代价函数
- 在训练完算法后,我们预测 (θ(j))Tx(i) 为用户 j 给电影 i 的评分从而进行推荐
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/