
摘要:商业网站迅猛发展的时代已经到来,网上服务的交易方式正在改变着传统的商业模式。如果说过去的十年是搜索技术高速发展的十年,那么个性化推荐技术将作为下一个十年中最为重要的革新之一。目前几乎所有大型的商业网站,如亚马逊、淘宝网等,都不同程度地使用了各种形式的推荐系统。本文就推荐系统这一话题展开讨论,首先介绍了推荐系统的提出和发展过程,然后列举出了几种推荐系统的研究方法,其中,详细的描述了Slope one算法推荐系统的实现过程以及用Slope one算法编写程序完成了电影推荐系统。最后列举了几个推荐系统的实例。
关键字:Slope one算法推荐系统数据挖掘个性化推荐
一、发展背景:
随着Internet的日益普及,商业网站的蓬勃发展,如何提高商业网站的有效性,尤其是如何运用个性化推荐技术提供个性化服务来实现已逐渐成为一个能引起广泛兴趣的热点课题。虽然商业网站从“以站点为中心”向“以用户为中心”发展成为必然趋势。但目前国内大多数商业网站的商品推荐通常是:推荐热销产品;推荐相关产品;依据用户浏览历史的信息进行推荐。由 Daniel Lemire教授在 2005 年提出的一个 Item-Based(基于条目)推荐算法,可应用于各类以网上商品销售为主业务的网上商店,以及提供文章、新闻、音乐、电影等“无形”的产品的网络站点。用于帮助商店经营者,网络站点从事产品的个性化推荐,提高营销及服务质量,更好地挖掘潜在客户及客户的使用、购买潜能。同时也根据用户的喜好,网站会留下记录,当用户再次访问时,网站会推荐用户可能喜欢的东西,这样也方便了用户,用户无需浪费时间去搜索大量的信息。
二、现有推荐系统研究方法:
1、基于内容的推荐:
基于内容的推荐(content-based recommendation)是指根据用户选择的对象,推荐其他类似属性的对象作为推荐,属于Schafer 划分中的Item-to-Item Correlation 方法.这类算法源于一般的信息检索方法.不需要依据用户对对象的评价意见.对象使用通过特征提取方法得到的对象内容特征来表示,系统基于用户所评价对象的特征,学习用户的兴趣,从而考察用户资料与待预测项目相匹配的程度.
对象内容特征(Content(s))的选取在目前的研究中以对象的文字描述为主,比如信息检索中最经典的文本特征是词频-倒排文档频率(term frequency-inverse document frequency,简称 TF-IDF).另一方面,用户的资料模型ContentBasedProfile(c)取决于所用机器学习方法,常用的有决策树、贝叶斯分类算法、神经网络、基于向量的表示方法等,数据挖掘领域的众多算法都可以应用.
2、协同过滤推荐
协同过滤推荐(collaborative filtering recommendation)技术是推荐系统中最为成功的技术之一,它于 20 世纪 90 年代开始研究并促进了整个推荐系统研究的繁荣.大量论文和研究都属于这个类别.
协同过滤的基本思想是:找到与当前用户ccur相似(比如兴趣和口味相似的其他用户cj,计算对象s 对于用户的效用值u(cj,s),利用效用值对所有s 进行排序或者加权等操作,找到最适合ccur的对象s*.其基本思想非常易于理解,在日常生活中,我们往往会利用好朋友的推荐来进行一些选择.协同过滤正是把这一思想运用到推荐系统中来,即基于其他用户对某一内容的评价向目标用户进行推荐.
基于协同过滤的推荐系统可以说是从用户的角度进行推荐的,并且是自动的,也就是说,用户所获得的推荐是系统从用户购买或浏览等行为中隐式获得的,不需要用户主动去查找适合自己兴趣的推荐信息,如填写一些调查表格等.其另外一个优点是对推荐对象没有特殊的要求(而基于内容的推荐需要对推荐对象进行特征分析),能够处理非结构化的复杂对象,如音乐、电影等.同时,研究用户之间的关系需要大量的用户访问行为的历史数据,与社会网络研究有交叉点,有丰富的研究基础和广阔的前景.对协同过滤最早的研究有Grundy system, 后来的研究成果包括 Tapestry system, GroupLens, Ringo, PHOAKS system, Jester system]等.总体而言, 此类推荐算法可以分为两类:启发式(heuristic-based or memory-based)方法和基于模型(model-based)的方法。
3、基于知识的推荐:
基于知识的推荐(knowledge-based recommendation)在某种程度上可以看成是一种推理(inference)技术.它不是建立在用户需要和偏好基础上推荐的,而是利用针对特定领域制定规则(rule)来进行基于规则和实例的推理(case-based reasoning).例如,文献[34]中利用饭店的菜式方面的效用知识,推荐饭店给顾客.效用知识(functional knowledge)是一种关于一个对象如何满足某一特定用户的知识,因而能够解释需求和推荐的关系,用于推荐系统.效用知识在推荐系统中必须以机器可读的方式存在(ontology 本体知识库),例如 quickstep and foxtrot systems使用关于学术论文主题的ontology本体知识库向读者作推荐.
4、Slope one算法推荐:
Slope One 是一系列应用于 协同过滤的算法的统称。由 Daniel Lemire和Anna Maclachlan于2005年发表的论文中提出。有争议的是,该算法堪称基于项目评价的non-trivial 协同过滤算法最简洁的形式。该系列算法的简洁特性使它们的实现简单而高效,而且其精确度与其它复杂费时的算法相比也不相上下。 该系列算法也被用来改进其它算法。当可以对一些项目评分的时候,比如人们可以对一些东西给出1到5星的评价的时候,协同过滤意图基于一个个体过去对某些项目的评分和(庞大的)由其他用户的评价构成的数据库,来预测该用户对未评价项目的评分。 如: 如果一个人给披头士的评分为5(总分5)的话,我们能否预测他对席琳狄翁新专辑的评分呢?
这种情形下, item-based 协同过滤系统 根据其它项目的评分来预测项目的分值,一般方法为线性回归(). 于是,需要列出x^2个线性回归方程和回归量,例如:当有1000个项目时,需要列多达1,000,000个线性回归方程, 以及多达2,000,000个回归量。除非我们只选择某些用户共同评价过的项目对,否则协同过滤会遇到过适(过拟合) 问题。
三、Slope one算法描述及实现过程:
1、算法原型:
图例一(如图3-1所示):
图 3-1 算法演示图一
如上图所示,UserA对ItemA的评分是4,对ItemB的评分是3,UserB对ItemA的评分是2,那么,预测UserB对ItemB的评分是多少呢?
根据Slope One算法,2+(3-4)=1。
图例二(如图3-2所示):
图 3-2 算法演示图二
如上图所示,UserB对ItemB的评分会是多少呢?股票上有个说法是平均值可以掩盖一切的异常波动,所以股票上的各个技术指标是收集不同时间段的平均值的曲线图或是柱状图等。同样的,Slope One 算法也认为:平均值也可以代替某两个未知个体之间的打分差异,条目 A 条目B 的平均差值是:
=0.5
也就是说人们对事物 A 的打分一般比事物 B 的打分要高 0.5,于是 Slope one 算法就猜测UserB对事物 B 的打分是 2 - 0.5 = 1.5。
2、加权算法:
由上的两个示例对Slope One算法有了认识。如果有100个用户对ItemA和ItemB都打过分,有 1000 个用户对ItemC和ItemB也打过分。显然这两个 rating 差的权重是不一样的。因此我们可以推测,计算方法是:
Slope One 算法的加权算法数学描述如下:有 N 个用户对条目 A 和条目 B 打分了,R(A->B)表示这 N 位用户对 A 和对 B 打分的平均差(A-B),有 M 位用户对条目B 和条目 C 打分了,R(C->B)表示这 M 位用户对 C 和对 B 打分的平均差(C-B),注意都是平均差而不是平方差,现在某个用户对 A 的打分是ra,对 C 的打分是rc,那么 A 对 B 的打分可能是:
rb=
上面讨论的是用户只对条目的喜好程度打分。还有一种情况下用户也可以对条目的厌恶程度打分。这时可以使用双极 Slope One 算法(BI-Polar Slope One)。
四、实验结果:
注释:此数据代表按照自己和别人的评分推荐的电影
| 致青春 | 北京遇上西雅图 | 人再囧途之泰囧 | 少年派的奇幻漂流 | 黑衣人三 | 白鹿原 | 二次曝光 | 速度与激情五 | 泰迪熊 | 功夫熊猫 | 源代码 | 猩球崛起 | 失恋三十三天 | 志明与春娇 | 听风者 | 这个杀手不太冷 | 肖申克的救赎 | 唐伯虎点秋香 | 大话西游 | 泰坦尼克号 | ||
| 卢一强 | 0 | 4.2 | 0 | 0 | 0 | 0 | 0 | 4.13 | 0 | 3.92 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 燕睿涛 | 3.88 | 4.26 | 0 | 0 | 3.21 | 2.59 | 2. | 0 | 3.35 | 0 | 0 | 0 | 0 | 3.83 | 0 | 0 | 5.45 | 0 | 0 | 4.97 | |
| 龚志鑫 | 0 | 4.53 | 0 | 4.54 | 0 | 2.77 | 0 | 0 | 3.52 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 阿鹏仁 | 2.98 | 0 | 0 | 3.29 | 2.31 | 0 | 0 | 3.23 | 2.35 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 刘少博 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 姚伟娜 | 3.41 | 3.71 | 0 | 3.8 | 2.72 | 1.98 | 0 | 3.78 | 2.74 | 3.5 | 3.83 | 3.62 | 0 | 0 | 3.81 | 0 | 0 | 0 | 3.53 | 0 | |
| 汤瑶 | 3.43 | 3.82 | 0 | 3.76 | 2.68 | 1.98 | 0 | 0 | 2.78 | 0 | 0 | 0 | 2.93 | 0 | 3.88 | 0 | 0 | 0 | 0 | 4.46 | |
| 刘思遥 | 3.13 | 3.43 | 0 | 0 | 2.5 | 1.82 | 1.95 | 3.44 | 2.57 | 0 | 0 | 0 | 2.65 | 3.11 | 3.65 | 0 | 4.74 | 0 | 0 | 4.23 | |
| 孙召星 | 3.36 | 0 | 0 | 0 | 0 | 1.92 | 2.11 | 3. | 2.76 | 0 | 0 | 3.55 | 2.82 | 3.21 | 3.76 | 0 | 4. | 0 | 0 | 0 | |
| 刘璐 | 3.87 | 4.24 | 0 | 0 | 3.23 | 0 | 0 | 4.17 | 3.32 | 0 | 0 | 4.05 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 吴林 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 李长月 | 3.8 | 4.02 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4.02 | 0 | 3.67 | 4.18 | 0 | 0 | 0 | 0 | 0 | |
五、推荐系统在几个网站中实例:
1、下面几幅图是在卓越亚马逊上根据浏览记录推荐的商品:
2、下面的这幅图示在网上看过电影后推荐的
3、人人网上按照共同好友的数量推荐的好友:
六、参考文献:
[1]《推荐系统实践》项亮人民邮电出版社
[2]《MATLAB7.x基础教程》张笑天等西安电子科技大学出版社,2008年。
附录
附录一:成员介绍及分工:
代码编写:汤瑶、刘少博
资料查阅:姚伟娜、刘璐
评分统计:卢一强、李长月、燕睿涛
PPT制作:吴林、刘思遥
孙召星、龚志鑫
报告撰写:阿鹏仁
附录二:matlab代码
clear
[ua1,ua2,ua3,ua4,ua5]=textread('u1_base.txt','%d %d %d %d %d');
[uat1,uat2,uat3,uat4,uat5]=textread('u1_test.txt','%d %d %d %d %d');
Train=[ua1,ua2,ua3];
Test=[uat1,uat2,uat3];
user=unique(ua1);
movie=unique(ua2);
m=max(user);
n=max(movie);
Score=zeros(m,n);
for i=1:length(ua1)
Score(ua1(i),ua2(i))=ua3(i);
end
predictS=slope_one_w(Score,Test);
predictS(find(predictS>=5))=5;
J=(sum((predictS-uat3).^2)/length(uat3))^0.5;
% J=sum((round(predictS)-uat3).^2);
ratio=sum(round(predictS)==uat3)/length(uat3);
idxp4=find(round(predictS)==4);
idxp5=find(round(predictS)==5);
idxp=[idxp4;idxp5];
ratior=sum(uat3(idxp)>=4)/length(idxp);
function M=slope_one_w(A,Test)
tic;
[m,n]=size(A);
gB=ones(n);
B=tril(gB);%上三角存平均评分差,下三角存评分的权重
%即共同的评分人数
%计算每两列间的平均评分差
for i=1:n-1
for j=i+1:n
C=[A(:,i),A(:,j)];
C(C(:,1)==0,:)=[];
C(C(:,2)==0,:)=[];
if C
B(i,j)=sum(C(:,2)-C(:,1))/length(C(:,1));
B(j,i)=length(C(:,1));
end
end
end
M=zeros(length(Test(:,1)),1);
for z=1:length(Test(:,1))
i=Test(z,1);
j=Test(z,2);
if ~A(i,j)
C=A(i,:);
X=find(C~=0);
temp=0;%各权重之和
for k=1:1:length(X)
if j>X(k)
A(i,j)=A(i,j)+((A(i,X(k))+B(X(k),j)))*B(j,X(k));
temp=temp+B(j,X(k));
else
A(i,j)=A(i,j)+((A(i,X(k))-B(j,X(k))))*B(X(k),j);
temp=temp+B(X(k),j);
end
end
A(i,j)=A(i,j)/temp;
M(z)=A(i,j);
A(i,j)=0;
end
end
toc;
end
附录三:原始数据
| 致青春 | 北京遇上西雅图 | 人再囧途之泰囧 | 少年派的奇幻漂流 | 黑衣人三 | 白鹿原 | 二次曝光 | 速度与激情五 | 泰迪熊 | 功夫熊猫 | 源代码 | 猩球崛起 | 失恋三十三天 | 志明与春娇 | 听风者 | 这个杀手不太冷 | 肖申克的救赎 | 唐伯虎点秋香 | 大话西游 | 泰坦尼克号 | |
| 卢一强 | 3 | 0 | 4 | 5 | 4 | 4 | 3 | 0 | 3 | 0 | 3 | 4 | 2 | 5 | 4 | 5 | 5 | 4 | 4 | 4 |
| 燕睿涛 | 0 | 0 | 5 | 4 | 0 | 0 | 0 | 3 | 0 | 4 | 5 | 3 | 3 | 0 | 5 | 4 | 0 | 4 | 5 | 0 |
| 龚志鑫 | 5 | 0 | 3 | 0 | 1 | 0 | 1 | 5 | 0 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
| 阿鹏仁 | 0 | 4 | 4 | 0 | 0 | 1 | 1 | 0 | 0 | 3 | 4 | 3 | 3 | 4 | 4 | 3 | 5 | 3 | 1 | 4 |
| 刘少博 | 2 | 3 | 4 | 1 | 3 | 1 | 2 | 2 | 2 | 3 | 3 | 3 | 2 | 2 | 3 | 4 | 5 | 4 | 3 | 4 |
| 姚伟娜 | 0 | 0 | 4 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 3 | 3 | 0 | 5 | 5 | 2 | 0 | 5 |
| 汤瑶 | 0 | 0 | 4 | 0 | 0 | 0 | 2 | 4 | 0 | 3 | 5 | 3 | 0 | 3 | 0 | 3 | 5 | 4 | 4 | 0 |
| 刘思遥 | 0 | 0 | 4 | 3 | 0 | 0 | 0 | 0 | 0 | 4 | 4 | 4 | 0 | 0 | 0 | 2 | 0 | 4 | 3 | 0 |
| 孙召星 | 0 | 2 | 4 | 5 | 3 | 0 | 0 | 0 | 0 | 4 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 5 | 5 | 5 |
| 刘璐 | 0 | 0 | 3 | 5 | 0 | 3 | 4 | 0 | 0 | 4 | 4 | 0 | 3 | 3 | 4 | 5 | 5 | 4 | 4 | 5 |
| 吴林 | 4 | 4 | 4 | 4 | 3 | 1 | 1 | 4 | 3 | 3 | 4 | 4 | 3 | 2 | 3 | 4 | 5 | 3 | 2 | 4 |
| 李长月 | 0 | 0 | 3 | 4 | 3 | 2 | 4 | 5 | 3 | 3 | 4 | 0 | 3 | 0 | 0 | 4 | 5 | 4 | 5 | 5 |
