基于用户的协同过滤与基于项目的协同过滤的区别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于⽤户的协同过滤与基于项⽬的协同过滤的区别
⾸先我们不介绍他们具体的区别,我只是在实验的过程中渐渐发现,区别其实就是站在不同的⾓度去思考问题:
基于⽤户的协同过滤:在上篇博客中我介绍了基于⽤户的协同过滤,我们是⽤⽤户的以往评分来计算⽤户之间的相似度。

for i=1:temp
[~,m]=size(find(score_matrix(P_ab(i),:)~=0));%计算该⽤户评价的电影个数
sum_score=sum(score_matrix(P_ab(i),:),2);%⽤户对所有电影的总评分
aver_score=sum_score/m;
sum1=sum1+(score_matrix(P_ab(i),a)-aver_score)*(score_matrix(P_ab(i),b)-aver_score);
% sum1=sum1+(score_matrix(P_ab(i),a)*score_matrix(P_ab(i),b));
%sum2=sum2+score_matrix(P_ab(i),a)^2;
sum2=(score_matrix(P_ab(i),a)-aver_score)^2;
sum3=sum3+(score_matrix(P_ab(i),b)-aver_score)^2;
% sum3=sum3+score_matrix(P_ab(i),b)^2;
end
if sum2==0||sum3==0
Sim_ab=0;
else
Sim_ab=sum1/(sqrt(sum2)*sqrt(sum3));
现在是⽤⽪尔逊相似度计算⽤户之间的相似度,下⾯步⼊正题介绍同志们不熟悉的基于项⽬的协同过滤。

⼩⼩⾃恋⼀下
顾名思义基于项⽬的协同过滤是⼀种要考虑是项⽬之间的相似度,
基于物品的协同过滤算法主要分为两步:
⼀、计算物品之间的相似度;
⼆、根据物品的相似度和⽤户的历史⾏为给⽤户⽣成推荐列表;
下⾯分别来看这两步如何计算:
⼀、计算物品之间的相似度:
我们使⽤下⾯的公式定义物品的相似度:
其中,|N(i)|是喜欢物品i的⽤户数,|N(j)|是喜欢物品j的⽤户数,|N(i)&N(j)|是同时喜欢物品i和物品j的⽤户数。

从上⾯的定义看出,在协同过滤中两个物品产⽣相似度是因为它们共同被很多⽤户喜欢,两个物品相似度越⾼,说明这两个物品共同被很多⼈喜欢。

这⾥⾯蕴含着⼀个假设:就是假设每个⽤户的兴趣都局限在某⼏个⽅⾯,因此如果两个物品属于⼀个⽤户的兴趣列表,那么这两个物品可能就属于有限的⼏个领域,⽽如果两个物品属于很多⽤户的兴趣列表,那么它们就可能属于同⼀个领域,因⽽有很⼤的相似度。

举例,⽤户A对物品a、b、d有过⾏为,⽤户B对物品b、c、e有过⾏为,等等;
依此构建⽤户——物品倒排表:物品a被⽤户A、E有过⾏为,等等;
建⽴物品相似度矩阵C:
其中,C[i][j]记录了同时喜欢物品i和物品j的⽤户数,这样我们就可以得到物品之间的相似度矩阵W。

在得到物品之间的相似度后,进⼊第⼆步。

⼆、根据物品的相似度和⽤户的历史⾏为给⽤户⽣成推荐列表:
ItemCF通过如下公式计算⽤户u对⼀个物品j的兴趣:
其中,Puj表⽰⽤户u对物品j的兴趣,N(u)表⽰⽤户喜欢的物品集合(i是该⽤户喜欢的某⼀个物品),S(i,k)表⽰和物品i最相似的K个物品集合(j是这个集合中的某⼀个物品),Wji表⽰物品j和物品i的相似度,Rui表⽰⽤户u 对物品i的兴趣(这⾥简化Rui都等于1)。

本⼈计算相似度建议使⽤以下⽅法:
function Sim_ab=Similarity_ab(item_matrix,a,b)
temp1=item_matrix(a,:); %找出评价电影a所有⽤户的集合
temp2=item_matrix(b,:); %找出评价电影b所有⽤户的集合
P_ab1=find(temp1);
P_ab3=P_ab1';%⽤⾏向量存储所有评价电影a的⽤户
P_ab2=find(temp2);
P_ab4=P_ab2' ;%⽤⾏向量存储所有评价电影b的⽤户
%%计算物品之间的相似度
if isempty(P_ab3)
Sim_ab=0;
if isempty(P_ab4)
Sim_ab=0;
else
% sum1=0;
% sum2=0;
sum1=length(find(P_ab3==P_ab4));
sum2=sqrt(abs(sqrt(sum(P_ab3.^2)))*abs(sqrt(sum(P_ab4.^2))));
Sim_ab=sum1/sum2;
本⼈认为在学习协同过滤时应该分清基于⽤户的算法还是基于项⽬的算法,否则后果⾃负啊!。

相关文档
最新文档