基于协同过滤的推荐算法及代码实现

基于协同过滤的推荐算法及代码实现
基于协同过滤的推荐算法及代码实现

基于协同过滤的推荐算法与代码实现

什么是协同过滤?

协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤(Collaborative Filtering, 简称CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。

协同过滤一般是在海量的用户中发掘出一小部分和你品位比较类似的,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的其他东西组织成一个排序的目录作为推荐给你。当然其中有一个核心的问题:

如何确定一个用户是不是和你有相似的品位?

如何将邻居们的喜好组织成一个排序的目录?

简单来说:

1. 和你兴趣合得来的朋友喜欢的,你也很有可能喜欢;

2. 喜欢一件东西A,而另一件东西B 与这件十分相似,就很有可能喜欢B;

3. 大家都比较满意的,人人都追着抢的,我也就很有可能喜欢。

三者均反映在协同过滤的评级(rating)或者群体过滤(social filtering)这种行为特性上。

深入协同过滤的核心

首先,要实现协同过滤,需要一下几个步骤:

1. 收集用户偏好

2. 找到相似的用户或物品

3. 计算推荐

(1)收集用户偏好

要从用户的行为和偏好中发现规律,并基于此给予推荐,如何收集用户的偏好信息成为系统推荐效果最基础的决定因素。用户有很多方式向系统提供自己的偏好信息,而且不同的应用也可能大不相同,下面举例进行介绍:

以上列举的用户行为都是比较通用的,推荐引擎设计人员可以根据自己应用的特点添加特殊的用户行为,并用他们表示用户对物品的喜好。

在一般应用中,我们提取的用户行为一般都多于一种,关于如何组合这些不同的用户行为,基本上有以下两种方式:

将不同的行为分组:一般可以分为“查看”和“购买”等等,然后基于不同的行为,计算不同的用户/物品相似度。类似于当当网或者Amazon 给出的“购买了该图书的人还购买了...”,“查看了图书的人还查看了...”

根据不同行为反映用户喜好的程度将它们进行加权,得到用户对于物品的总体喜好。一般来说,显式的用户反馈比隐式的权值大,但比较稀疏,毕竟进行显示反馈的用户是少数;同时相对于“查看”,“购买”行为反映用户喜好的程度更大,但这也因应用而异。

收集了用户行为数据,我们还需要对数据进行一定的预处理,其中最核心的工作就是:减噪和归一化。

减噪:用户行为数据是用户在使用应用过程中产生的,它可能存在大量的噪音和用户的误操作,我们可以通过经典的数据挖掘算法过滤掉行为数据中的噪音,这样可以是我们的分析更加精确。

归一化:如前面讲到的,在计算用户对物品的喜好程度时,可能需要对不同的行为数据进行加权。但可以想象,不同行为的数据取值可能相差很大,比如,用户的查看数据必然比购买数据大的多,如何将各个行为的数据统一在一个相同的取值范围中,从而使得加权求和得到的总体喜好更加精确,就需要我们进行归一化处理。最简单的归一化处理,就是将各类数据除以此类中的最大值,以保证归一化后的数据取值在[0,1] 范围中。

进行的预处理后,根据不同应用的行为分析方法,可以选择分组或者加权处理,之后我们可以得到一个用户偏好的二维矩阵,一维是用户列表,另一维是物品列表,值是用户对物品的偏好,一般是[0,1] 或者[-1, 1] 的浮点数值。

(2)找到相似的用户或物品

当已经对用户行为进行分析得到用户喜好后,我们可以根据用户喜好计算相似用户和物品,然后基于相似用户或者物品进行推荐,这就是最典型的CF 的两个分支:基于用户的CF和基于物品的CF。这两种方法都需要计算相似度,下面我们先看看最基本的几种计算相似度的方法。

相似度的计算

关于相似度的计算,现有的几种基本方法都是基于向量(Vector)的,其实也就是计算两个向量的距离,距离越近相似度越大。在推荐的场景中,在用户-物品偏好的二维矩阵中。我们可以将一个用户对所有物品的偏好作为一个向量来计算用户的相似度;或者将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度。

下面我们详细介绍几种常用的相似度计算方法:

相似邻居的计算

介绍完相似度的计算方法,下面我们看看如何根据相似度找到用户-物品的邻居,常用的挑选邻居的原则可以分为两类:下图给出了二维平面空间上点集的示意图。

固定数量的邻居:K-neighborhoods 或者Fix-size neighborhoods

不论邻居的“远近”,只取最近的K 个,作为其邻居。如上图中的A,假设要计算点1 的5-邻居,那么根据点之间的距离,我们取最近的5 个点,分别是点2,点3,点4,点7 和点5。但很明显我们可以看出,这种方法对于孤立点的计算效果不好,因为要取固定个数的邻居,当它附近没有足够多比较相似的点,就被迫取一些不太相似的点作为邻居,这样就影响了邻居相似的程度,比如上图中,点1 和点5 其实并不是很相似。

基于相似度门槛的邻居:Threshold-based neighborhoods

与计算固定数量的邻居的原则不同,基于相似度门槛的邻居计算是对邻居的远近进行最大值的限制,落在以当前点为中心,距离为K 的区域中的所有点都作为当前点的邻居,这种方法计算得到的邻居个数不确定,但相似度不会出现较大的误差。如上图中的B,从点1 出发,计算相似度在K 内的邻居,得到点2,点3,点4 和点7,这种方法计算出的邻居的相似度程度比前一种好,尤其是对孤立点的处理。

(3)计算推荐

经过前期的计算已经得到了相邻用户和相邻物品,下面介绍如何基于这些信息为用户进行推荐。本系列的上一篇综述文章已经简要介绍过基于协同过滤的推荐算法可以分为基于用户的CF 和基于物品的CF,下面我们深入这两种方法的计算方法,使用场景和优缺点。

基于用户的CF(User CF)

基于用户的CF 的基本思想相当简单,基于用户对物品的偏好找到相邻邻居用户,然后将邻居用户喜欢的推荐给当前用户。计算上,就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,找到K 邻居后,根据邻居

的相似度权重以及他们对物品的偏好,预测当前用户可能喜欢的物品,计算得到一个排序的物品列表作为推荐(排序列表中每个物品都有相应的预测值)。下图给出了一个例子,对于用户A,根据用户的历史偏好,这里只计算得到一个邻居用户C,然后将用户C 喜欢的物品D 推荐给用户A。

基于物品的CF(Item CF)

基于物品的CF 的原理和基于用户的CF 类似,只是在计算邻居时采用物品本身,而不是从用户的角度,即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。从计算的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似物品后,根据用户历史的偏好预测当前用户还没有表示偏好的物品,计算得到一个排序的物品列表作为推荐。下图给出了一个例子,对于物品A,根据所有用户的历史偏好,喜欢物品A 的用户都喜欢物品C,得出物品A 和物品C 比较相似,而用户C 喜欢物品A,那么可以推断出用户C 可能也喜欢物品C。

User CF vs Item CF

前面介绍了User CF 和Item CF 的基本原理,下面我们分几个不同的角度深入看看它们各自的优缺点和适用场景:

计算复杂度

Item CF和User CF 是基于协同过滤推荐的两个最基本的算法,User CF 是很早以前就提出来了,Item CF 是从Amazon 的论文和专利发表之后(2001 年左右)开始流行,大家都觉得Item CF 从性能和复杂度上比User CF 更优,其中的一个主要原因就是对于一个在线网站,用户的数量往往大大超过物品的数量,同时物品的数据相对稳定,因此计算物品的相似度不但计算量较小,同时也不必频繁更新。但我们往往忽略了这种情况只适应于提供商品的电子商务网站,对于新闻,博客或者微内容的推荐系统,情况往往是相反的,物品的数量是海量的,同时也是更新频繁的,所以单从复杂度的角度,这两个算法在不同的系统中各有优势,推荐引擎的设计者需要根据自己应用的特点选择更加合适的算法。

适用场景

在非社交网络的网站中,内容内在的联系是很重要的推荐原则,它比基于相似用户的推荐原则更加有效。比如在购书网站上,当你看一本书的时候,推荐引擎会给你推荐相关的书籍,这个推荐的重要性远远超过了网站首页对该用户的综合推荐。可以看到,在这种情况下,Item CF 的推荐成为了引导用户浏览的重要手段。同时Item CF 便于为推荐做出解释,在一个非社交网络的网站中,给某个用户推荐一本书,同时给出的解释是某某和你有相似兴趣的人也看了这本书,这很难让用户信服,因为用户可能根本不认识那个人;但如果解释说是因为这本书和你以前看的某本书相似,用户可能就觉得合理而采纳了此推荐。

相反的,在现今很流行的社交网络站点中,User CF 是一个更不错的选择,User CF 加上社会网络信息,可以增加用户对推荐解释的信服程度。

推荐多样性和精度

研究推荐引擎的学者们在相同的数据集合上分别用User CF 和Item CF 计算推荐结果,发现推荐列表中,只有50% 是一样的,还有50% 完全不同。但是这两个算法居然有相似的精度,所以可以说,这两个算法是很互补的。

关于推荐的多样性,有两种度量方法:

第一种度量方法是从单个用户的角度度量,就是说给定一个用户,查看系统给出的推荐列表是否多样,也就是要比较推荐列表中的物品之间两两的相似度,不难想到,对这种度量方法,Item CF 的多样性显然不如User CF 的好,因为Item CF 的推荐就是和以前看的东西最相似的。

第二种度量方法是考虑系统的多样性,也被称为覆盖率(Coverage),它是指一个推荐系统是否能够提供给所有用户丰富的选择。在这种指标下,Item CF 的多样性要远远好于User CF, 因为User CF 总是倾向于推荐热门的,从另一个侧面看,也就是说,Item CF 的推荐有很好的新颖性,很擅长推荐长尾里的物品。所以,尽管大多数情况,Item CF 的精度略小User CF,但如果考虑多样性,Item CF 却比User CF 好很多。

如果你对推荐的多样性还心存疑惑,那么下面我们再举个实例看看User CF 和Item CF 的多样性到底有什么差别。首先,假设每个用户兴趣爱好都是广

泛的,喜欢好几个领域的东西,不过每个用户肯定也有一个主要的领域,对这个领域会比其他领域更加关心。给定一个用户,假设他喜欢3 个领域A、B、C,A 是他喜欢的主要领域,这个时候我们来看User CF 和Item CF 倾向于做出什么推荐:如果用User CF, 它会将A,B,C 三个领域中比较热门的东西推荐给用户;而如果用ItemCF,它会基本上只推荐 A 领域的东西给用户。所以我们看到因为User CF 只推荐热门的,所以它在推荐长尾里项目方面的能力不足;而Item CF 只推荐A 领域给用户,这样他有限的推荐列表中就可能包含了一定数量的不热门的长尾物品,同时Item CF 的推荐对这个用户而言,显然多样性不足。但是对整个系统而言,因为不同的用户的主要兴趣点不同,所以系统的覆盖率会比较好。

从上面的分析,可以很清晰的看到,这两种推荐都有其合理性,但都不是最好的选择,因此他们的精度也会有损失。其实对这类系统的最好选择是,如果系统给这个用户推荐30 个物品,既不是每个领域挑选10 个最热门的给他,也不是推荐30 个A 领域的给他,而是比如推荐15 个A 领域的给他,剩下的15 个从B,C 中选择。所以结合User CF 和Item CF 是最优的选择,结合的基本原则就是当采用Item CF 导致系统对个人推荐的多样性不足时,我们通过加入User CF 增加个人推荐的多样性,从而提高精度,而当因为采用User CF 而使系统的整体多样性不足时,我们可以通过加入Item CF 增加整体的多样性,同样可以提高推荐的精度。

用户对推荐算法的适应度

前面我们大部分都是从推荐引擎的角度考虑哪个算法更优,但其实我们更多的应该考虑作为推荐引擎的最终使用者——应用用户对推荐算法的适应度。

对于User CF,推荐的原则是假设用户会喜欢那些和他有相同喜好的用户喜欢的东西,但如果一个用户没有相同喜好的朋友,那User CF 的算法的效果就会很差,所以一个用户对的CF 算法的适应度是和他有多少共同喜好用户成正比的。

Item CF算法也有一个基本假设,就是用户会喜欢和他以前喜欢的东西相似的东西,那么我们可以计算一个用户喜欢的物品的自相似度。一个用户喜欢物品的自相似度大,就说明他喜欢的东西都是比较相似的,也就是说他比较符合Item CF 方法的基本假设,那么他对Item CF 的适应度自然比较好;反之,如果自相似度小,就说明这个用户的喜好习惯并不满足Item CF 方法的基本假设,那么对于这种用户,用Item CF 方法做出好的推荐的可能性非常低。

通过以上的介绍,相信大家已经对协同过滤推荐的各种方法,原则,特点和适用场景有深入的了解,下面我们就进入实战阶段。

推荐电影的例子

下面,我们通过一个实际的小例子来完成这个过程,这个例子是关于用户电影的。

用户的历史操作

完成协同过滤这个算法的第一步就是你要知道谁喜欢什么。本例子中,不仅知道哪个用户喜欢哪个电影,并且还用具体的数字来量化了,也就是每人对电影有着评分。用一个字典表示,具体代码如下:

[python]view plaincopy

1.#一个字典,第一个key是人名,value是又是一个字典,字典里面key是电影名,value是评

2.critics={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane':

3.5,

3.'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5,

4.'The Night Listener': 3.0},

5.'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,

6.'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,

7.'You, Me and Dupree': 3.5},

8.'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,

9.'Superman Returns': 3.5, 'The Night Listener': 4.0},

10.'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,

11.'The Night Listener': 4.5, 'Superman Returns': 4.0,

12.'You, Me and Dupree': 2.5},

13.'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,

14.'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,

15.'You, Me and Dupree': 2.0},

16.'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,

17.'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3

.5},

18.'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns'

:4.0}}

用数字代表行为是一个非常关键的手段。这样才能进行编程,如下图所示:

基于用户的协同过滤

协同过滤:就是找到和目标用户有着相同爱好的人,然后把与目标用户有相同爱好的人喜欢的物品推荐给该目标用户。本文主要就是讲这个算法。

计算用户相似度

那么现在我们已经有了用户数据了,下一步就是:

找出爱好相同的用户。专业术语:寻找相近用户或者相似度高的用户。下面介绍三种计算相似度的体系:

?欧几里得距离

?皮尔逊相关度

?Tanimoto系数

欧几里得距离

实际上,欧几里得距离非常直观,对于某两部电影,所有的用户都对其有着评分,我们以一个电影为x轴、一个电影为y轴,将每个人的对两个电影的评分画在坐标系中,直接考察每对用户的直线距离,距离近的相似度高。比如电影:dupree和snake,可以画出的图如下所示:

虽然这幅图只使用了二维坐标系,但实际上三维、四维都是同样的道理。

求两点间直线的距离,我相信大家都知道怎么算吧?三维、四维、n维的其实和二维的一个

道理,都是两点差的平方和,再开方。注意:两点是指两个用户。在二维中就有x,y轴两个差值的平方和,而在n维中,就是n个差值的平方和。在本题中,对于两用户,必须是共同评过分的电影才有计算的意义。求出平方和再开方就是直线距离了。现在两用户越相邻距离越小,但是我们希望得到的是用户越相邻,数值越大,(0-1之间),故我们对最后的结果加1再求倒数就可以了。试想:如果两点重合,距离为1,再求倒数则是0被除,所以必须要加一。而如果两点距离越远,求倒数后值越小,符合我们的要求。解释清楚之后,让我们来看一看代码:

[python]view plaincopy

1.from math import sqrt

2.#利用欧几里得计算两个人之间的相似度

3.def sim_distance(prefs,person1,person2):

4.#首先把这个两个用户共同拥有评过分电影给找出来,方法是建立一个字典,字典的key电

影名字,电影的值就是1

5. si={}

6.for item in prefs[person1]:

7.if item in prefs[person2]:

8. si[item]=1

9.#如果亮着没有共同之处

10.if len(si)==0:return 0

11.

12.

13.#计算所有差值的平方和

14. sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) for

item in prefs[person1] if item in prefs[person2]])

15.

16.

17.return 1/(1+sqrt(sum_of_squares))

18.

19.

20.print sim_distance(critics,'Lisa Rose','Claudia Puig')

其中最后一句代码可以计算两个实例。

皮尔逊相关度评价

下面介绍的是皮尔逊相关度评价。用图讲是非常清晰的,我们用某两个用户作为x、y 轴,然后以用户对电影的评分,画出每一点来。如下图所示:

上图中superman电影的坐标为(3.0,5.0),这是因为用户Gene Seymour对其的评分为5,而mick lasalle的评分为3.考虑所有的点:我们画一条线,叫最佳拟合线:画的原则是尽可能地靠近图中所有的坐标点。就是上图的线,试想一种情况就是两个用户的评分完成一样,我们将得到一条线:所有点都在线上,而且线的角度是45度。这时,两个用户的兴趣完全相同,我们称之为1,我想别的拟合线与之对比即可看出差距吧。

来看一种情况较好的时候:上图的相关系数为0.4,下图为0.75。

上面有点讲出了推导原理的感觉,但是实际上我们求的就是皮尔逊相关系数,这是一个数学上的公式,其最后得到的结果是一个-1到1的之间的小数。-1称之为负相关:表示一个变量的值越大,另一个变量的值会反而越来越小。计算过程首先要找出两位评论者曾经评价过的物品,然后计算两者的评分总和平方和,并求出评分的乘积之和。利用公式算出pearson 相关系数,公式如下:其中X和Y分别是个数相同的数组或者是列表(python),相当于算出了两个数组之间的pearson相关度。

我们在本题的实际的应用中也是如此,我们算的时候,是根据两个用户对电影的打分来计算的,打分组成了数组列表。请看代码:

[python]view plaincopy

1.#返回两个人的皮尔逊相关系数

2.def sim_pearson(prefs,p1,p2):

3.

4.

5. si={}

6.for item in prefs[p1]:

7.if item in prefs[p2]: si[item]=1

8.

9.

10.#得到列表元素的个数

11. n=len(si)

12.

13.

14.#如果两者没有共同之处,则返回0

15.if n==0:return 1

16.

17.

18.#对共同拥有的物品的评分,分别求和

19. sum1=sum([prefs[p1][it] for it in si])

20. sum2=sum([prefs[p2][it] for it in si])

21.

22.

23.#求平方和

24. sum1Sq=sum([pow(prefs[p1][it],2)for it in si])

25. sum2Sq=sum([pow(prefs[p2][it],2)for it in si])

26.

27.

28.#求乘积之和

29. pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])

30.

31.

32.#计算皮尔逊评价值

33. num=pSum-(sum1*sum2/n)

34. den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))

35.

36.if den == 0:return 0

37.

38.

39. r=num/den

40.

41.

42.return r

43.

44.

45.

46.print sim_pearson(critics,'Lisa Rose','Gene Seymour')

虽然两者都可以计算出相关度,哪个更好取决于实际的应用。但是pearson有一个明显非常不错的地方,它可以忽略掉一种情况:比如A用户每次给出的分都比B用户高,也就是说A给的分普遍较高,那么此时如果用欧几里得距离的算法的话,会判定A与B的相似度比较低。然而pearson算法可以修正这一点,依然会得出A与B的相似度较高。pearson 为什么会有这样的特点呢?举例即可看出,如下图所示:

我给A写了两次评分,第二次评分恰好比第一次评分少了2分。画出来的两条线确实平行的,它们与45度的线的角度差距是一样的。我暂时是这么认为的。但是实际上是不是还有待查证。

Tanimoto系数

再讲一个Tanimoto系数,也是用来计算相似度的。非常简单。如有两个集合

A=[shirt,shoes,pants,socks]

B=[shirt,shirt,shoes]

两个集合的交集,就是重叠部分,我们称之为C。就是[shirt,shoes]。Na表示集合A

的个数,Nb表示集合B的个数。Nc表示集合C的个数。Tanimote系数公式如下:

代码:

[python]view plaincopy

1.def tanimoto(a,b):

2. c=[v for v in a if v in b]

3. return float(len(c))/(len(a)+len(b)-len(c))

对于这个应用没有实际的例子,只是叙述一下公式,为什么会突然在这里讲一下这个公式呢?这是因为我现在要做的项目就是音乐推荐,而我正在思考如何计算用户的相似度,那么就很有可能要利用到这个公式,实际上现在考虑的也比较多。我在合适的时候和写一篇关于这件事的博客。

除了上述三种计算相似度的公式,还有Jaccard系数和曼哈顿距离算法也可以用于相似度计算。

找出相似用户

既然可以计算每一对用户的相似度了,那么可以找出针对某一目标用户,与其兴趣相似的用户了。其实做的事就是做个循环,然后排个序,然后反转一下。代码如下:

[python]view plaincopy

1.def topMatches(prefs,person,n=5,similarity=sim_pearson):

2. scores=[(similarity(prefs,person,other),other)for other in prefs if othe

r != person]

3. scores.sort()

4. scores.reverse()

5.return scores[0:n]

6.

7.print topMatches(critics,'Toby',n=3)

产生推荐列表

我们确实可以得到与Toby兴趣相似的用户,然而,这并不是我们的最终目的,我们需要得到的是Toby可能喜欢的物品。根据书中的做法,如果从其相似用户中找随便挑一个没看过的电影做一个推荐的话,这太随意了。这一点非常重要,我现在觉得我音乐网站推荐系统也不能如此随意,但是我记得我后来将会该为基于物品的协同过滤,与此处的不同。先继续完成我的例子。

为了杜绝这样的随意,我们会采用一种利用加权的方式来为目标用户没有看过的电影的预测打分。加权的意思是指:无论与目标用户的相似度低还是高,都会影响着我们预测目标用户没看过的电影的分数,只是权重不一样而已。如下图所示

最后一排中的红线3.35即是为Toby没看过的电影Night的预测得分。具体来的就是上两排的12.89处于3.84。12.89的来历是将所有看过该电影的用户的打分乘以与toby的相似度的和。而3.84仅仅就是所有相似用户的相似度的总和。我们可以看到对于电影Lady,由于puig没有看过,所以它会对预测toby的分有任何影响。这就是说:相似度越高的用户的评分越能影响着预测目标用户对某个电影的打分。

代码如下:

[python]view plaincopy

1.#利用所有人对电影的打分,然后根据不同的人的相似度,预测目标用户对某个电影的打分

2.#所以函数名叫做得到推荐列表,我们当然会推荐预测分数较高的电影

3.#该函数写的应该是非常好,因为它我们知道的业务逻辑不太一样,但是它确实非常简单的完成任

4.def getRecommendations(prefs,person,similarity=sim_pearson):

5. totals={}

6. simSums={}

7.for other in prefs:

8.#不用和自己比较了

9.if other==person:continue

10. sim=similarity(prefs,person,other)

11.#忽略相似度为0或者是小于0的情况

12.if sim<=0:continue

13.for item in prefs[other]:

14.#只对自己还没看过的电影进行评价

15.if item not in prefs[person] or prefs[person][item]==0:

16.#相似度*评价值。setdefault就是如果没有就新建,如果有,就取那个

item

17. totals.setdefault(item,0)

18. totals[item]+=prefs[other][item]*sim

19.

20.#相似度之和

21. simSums.setdefault(item,0)

22. simSums[item]+=sim

23.#建立一个归一化的列表,这哪里归一化了?这不是就是返回了一个列表吗

24. rankings=[(total/simSums[item],item)for item,total in totals.items()]

25.

26.

27.#返回好经过排序的列表

28. rankings.sort()

29. rankings.reverse()

30.return rankings

31.

32.print getRecommendations(critics,'Toby')

结果:

[python]view plaincopy

1.>>>

2.[(

3.3477895267131013, 'The Night Listener'), (2.8325499182641614, 'Lady in t

he Water'), (2.530980**********, 'Just My Luck')]

3.>>>

如此,一个小型的推荐系统就建立成功了。

基于物品的协同过滤

数据的转变

接下来要讲一个重要的思想。就是利用用户对电影的评分,求出电影之间的相似度。试想,刚刚我们在topMatches方法里面得到了什么?与用户兴趣相似的用户。现在我们要求的是与电影相似的电影。这只是需要一个思维的转变。那就是:将用户对电影的评分看成,电影对用户的适应度。大概就是这个意思:大概电影自己给用户打了一个分:就是电影适合用户的程度。比如电影A给用户x打了4分,电影A又给用户y打了3分,结果电影B给用户x打了4分,电影B又给用户y打了3分。好吧,我们现在就说这个电影A和电影B

相似度百分百。因为它们两个对用户的适应度一模一样。这一点很有意思,我正在构思怎么用这个思路来构建我们的音乐网址的推荐系统。使用电影的例子中,我们还是实现一下:准备工作就是首先把字典里面的用户与电影的对应关系换一下。

转变前:

[python]view plaincopy

1.'Lisa Rose': {'Lady in the Water':

2.5, 'Snakes on a Plane':

3.5,'Just My Lu

ck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5, 'The Night Lis tener': 3.0}

转变后:

[python]view plaincopy

1.'Lady in the Water': {'Lisa Rose':

2.5, 'Jack Matthews':

3.0, 'Michael Phill

ips': 2.5, 'Gene Seymour': 3.0, 'Mick LaSalle': 3.0}

转变的代码:

[python]view plaincopy

1.#将用户对电影的评分改为,电影对用户的适应度

2.def transformprefs(prefs):

3. result={}

4.for person in prefs:

5.for item in prefs[person]:

6. result.setdefault(item,{})

7.

8.

9.#将把用户打分,赋值给电影的适应度

10. result[item][person]=prefs[person][item]

11.return result

接着使用

[python]view plaincopy

1.print topMatches(transformprefs(critics),'Superman Returns')

我们就可以得到与'Superman Returns'相似度较高的电影

[python]view plaincopy

1.>>>

2.[(0.6579516949597695, 'You, Me and Dupree'), (0.4879500364742689, 'Lady in t

he Water'), (0.11180339887498941, 'Snakes on a Plane'), (-0.1798471947990544, 'The Night Listener'), (-0.42289003161103106, 'Just My Luck')]

3.>>>

甚至我们还能预测某个电影对某个用户的适应度。

代码:

[python]view plaincopy

1.print getRecommendations(transformprefs(critics),'Just My Luck')

结果:

[python]view plaincopy

1.>>>

2.[(4.0, 'Michael Phillips'), (

3.0, 'Jack Matthews')]

3.>>>

注意,并不总是将人和物对调都能得到有意义的结果。对调的意义的书中一段来论述,我现在不是看的清楚,贴在这里

计算物品相似度

我们谈论的都是基于用户的协同过滤,他有一个缺点,就是当将用户与其他用户进行比较时,产生的计算时间也许会非常长。而且如果在一个物品特别多的情况下,也许会很难找出相似用户。在数据集非常多的情况,基于物品的协同过滤表现更好。

实际上这部分内容沿用了上一节,也就找出物品的相似物品。这样做有2个好处

大量计算预先进行(计算物品相似度)

快速给用户推荐结果

基于用户的协同过滤算法 UserCF流程图

UserCF算法主要流程: 主要全局变量: const int usersum = 6040; //用户总数 const int itemsum =3952; //项目总数 const int N =10; //为用户推荐前N个物品 int trainuser[usersum][itemsum]={0}; //训练集合user item rate矩阵 int test[usersum][itemsum]={0}; //测试集合user item rate矩阵 struct _simi { double value; //相似值 int num; //相似用户号 }; _simi simiUser[usersum][usersum]; //排序后的相似性矩阵double trainuserItem[usersum][itemsum]={0.0}; // user item 兴趣程度矩阵int recommend[usersum][N]={0}; //为每个用户推荐N个物品

拆分数据集函数int SplitData(int m, int k) 主要流程: 将数据集拆分为测试集test和训练集trainuser,其中1/m为测试集,取不同的k<=m-1值在相同的随即种子下可得到不同的测/训集合

计算用户之间相似度函数double Simility(int* Ua, int*Ub)主要流程:计算用户Ua和Ub的相似性,返回值为Ua和Ub的相似度

用户相似性矩阵排序函数int sort(double *simArr,_simi *simStruct)主要流程:根据相似性由高到低排序,每行第一个是自己

改进了协同过滤推荐算法的推荐系统的制作流程

图片简介:

本技术介绍了一种改进了协同过滤推荐算法的推荐系统,属于推荐系统技术相关领域。该推荐系统包括输入模块、推荐算法和输出模块三个部分,输入模块用于输入用户个人基本信息、用户对项目的评分和用户历史信息等;推荐算法根据输入信息分析用户兴趣爱好,寻找最相似用户和项目,给出预测的评分结果;输出模块依据用户输入请求,输出相应的推荐项目。其中改进部分是对推荐算法中冷启动问题进行优化。针对新用户、新项目和新系统不同的冷启动问题,提出了优化解决方法。 技术要求 1.一种改进了协同过滤推荐算法的推荐系统,其特征在于,包括输入模块、推荐算法和输出模块;输入模块用于输入用户个人基本信息、用户对项目的评分、用户历史信息和当 前的点击操作;推荐算法根据输入信息分析用户兴趣爱好,寻找最相似用户和项目,给 出预测的评分结果;输出模块依据用户输入请求,输出相应的推荐项目到客户端。 2.如权利要求1所述的一种改进了协同过滤推荐算法的推荐系统,其特征在于,所述推荐算法为协同过滤推荐算法,所述协同过滤推荐算法冷启动实现方式为:一、提供非个性 化的推荐,非个性化推荐的最简单例子就是热门排行榜,可以给用户推荐热门排行榜, 然后等到用户的反馈足够多,数据收集到一定的时候,再转换为个性化推荐;二、利用 用户的注册信息,提供的年龄、性别、职业等数据做粗粒度的个性化;三、利用用户的 社交网络账号登录,导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的 物品;四、利用物品的内容信息计算物品相关表,利用专家进行标注。 3.如权利要求2所述的一种改进了协同过滤推荐算法的推荐系统,其特征在于,在所述推荐算法中,用户点击商品链接后,推荐系统会记录用户的点击行为,然后系统计算用户 间相似度,找出与当前用户最相似的前N个用户,接着在这前N个用户中找出当前用户没有点击的商品,将点击率最高的几个商品加入推荐列表,最后将推荐列表发往客户端向 用户展示推荐的商品。

基于协同过滤的推荐算法及代码实现

基于协同过滤的推荐算法与代码实现 什么是协同过滤? 协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤(Collaborative Filtering, 简称CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。 协同过滤一般是在海量的用户中发掘出一小部分和你品位比较类似的,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的其他东西组织成一个排序的目录作为推荐给你。当然其中有一个核心的问题: 如何确定一个用户是不是和你有相似的品位? 如何将邻居们的喜好组织成一个排序的目录? 简单来说: 1. 和你兴趣合得来的朋友喜欢的,你也很有可能喜欢; 2. 喜欢一件东西A,而另一件东西B 与这件十分相似,就很有可能喜欢B; 3. 大家都比较满意的,人人都追着抢的,我也就很有可能喜欢。 三者均反映在协同过滤的评级(rating)或者群体过滤(social filtering)这种行为特性上。 深入协同过滤的核心 首先,要实现协同过滤,需要一下几个步骤: 1. 收集用户偏好 2. 找到相似的用户或物品 3. 计算推荐 (1)收集用户偏好 要从用户的行为和偏好中发现规律,并基于此给予推荐,如何收集用户的偏好信息成为系统推荐效果最基础的决定因素。用户有很多方式向系统提供自己的偏好信息,而且不同的应用也可能大不相同,下面举例进行介绍:

以上列举的用户行为都是比较通用的,推荐引擎设计人员可以根据自己应用的特点添加特殊的用户行为,并用他们表示用户对物品的喜好。 在一般应用中,我们提取的用户行为一般都多于一种,关于如何组合这些不同的用户行为,基本上有以下两种方式: 将不同的行为分组:一般可以分为“查看”和“购买”等等,然后基于不同的行为,计算不同的用户/物品相似度。类似于当当网或者Amazon 给出的“购买了该图书的人还购买了...”,“查看了图书的人还查看了...”

基于项目的协同过滤算法 ItemCF流程图

ItemCF算法主要流程: 主要全局变量: const int usersum = 6040; //用户总数 const int itemsum =3952; //项目总数 const int N =10; //为用户推荐前N个物品 int trainuser[usersum][itemsum]={0}; //训练集合user item rate矩阵 int test[usersum][itemsum]={0}; //测试集合user item rate矩阵 struct _simi { double value; //相似值 int num; //相似物品号 }; _simi simiItem[itemsum][itemsum]; //排序后的相似性矩阵double trainuserItem[usersum][itemsum]={0.0}; // user item 兴趣程度矩阵int recommend[usersum][N]={0}; //为每个用户推荐N个物品

拆分数据集函数int SplitData(int m, int k) 主要流程: 将数据集拆分为测试集test和训练集trainuser,其中1/m为测试集,取不同的k<=m-1值在相同的随即种子下可得到不同的测/训集合

计算项目之间相似度函数double Simility(int* ItemA, int* ItemB)主要流程:计算用户ItemA和ItemB的相似性,返回值为ItemA和ItemB的相似度

用户i对物品j预测兴趣程度函数double getUserLikeItem(int i,int j,int k)主要流程: 利用k个最近邻来计算

基于用户评分Kmeans聚类的协同过滤推荐算法实现

基于用户评分Kmeans聚类的协同过滤 推荐算法实现 一:基于用户评分Kmeans聚类的协同过滤推荐算法实现步骤 1、构建用户-电影评分矩阵: public Object readFile(String fileName){ List user = new ArrayList(); double[][] weight = new double[user_num][keyword_num]; List obj = new ArrayList(); try { File file = getFile(fileName); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line = ""; while (br.ready()) { line = br.readLine(); String[] data = line.split(" "); String[] str = data[1].split(";"); user.add(data[0]); for (int i = 0; i < str.length; i++) { String[] s = str[i].split(":");

weight[Integer.parseInt(data[0])-1][Integer.par seInt(s[0])-1] = Double.parseDouble(s[1]); } } obj.add(user); obj.add(weight); br.close(); } catch (Exception e) { e.printStackTrace(); } return obj; } 2、根据用户评分聚类: public class GenerateGroup implements Base{ private List initPlayers;//初始化,一个随机聚类中心 private List players;//每个用户实体类 public static List clusterHeart; public GenerateGroup(List list) { players = list;

一种改进的协同过滤推荐算法

种改进的协同过滤推荐算法 摘要:协同过滤算法自提出以来便得到了广泛运用,但 协同过滤算法本身具有的数据稀疏性及冷启动问题也制约了算法的性能。通过分析协同过滤算法的原理和不足,提出了一种改进协同过滤算法的思路,并在MovieLens 数据集上进行了验证,一定程度上提高了 算法性能。 关键词关键词:推荐系统;协同过滤;数据稀疏性文献标识码:A 文章编号:1672-7800(2016)004-0063-03 0 引言网络技术的 迅猛发展使得互联网上的信息呈现爆炸式 中图分类号:TP312 增长,为人们的生活和学习提供了便利,与此同时,海量的数据也带来了一些问题,其中最主要的就是“信息过载”问题。所谓信息过载问题,是指由于不相关的垃圾数据过多从而导致用户无法准确找到自己想要信息的问题。 为应对信息过载问题,人们提出了各种解决方案,其中 最为用户所熟悉的无疑是搜索引擎技术。但搜索引擎的服务是被动的,它要求使用者必须先给出一个搜索关键字,然后才能提供与该关键字相关的信息。这种完全依赖于关键字的服务模式要求用户能用关键字准确描述自己所需信息,否则

无法提供服务,但是现实中用户很多时候并不能精确描述自己的需求信息。这种情况下,以推荐系统为代表的技术可以较好地解决该问题,提高用户的使用体验。 1 协同过滤算法 1.1算法介绍 “协同过滤”技术最早由GlodBerg等于20世纪90年代 提出,该技术最初被用来过滤电子邮件[1],此后这种技术取得了商业上的巨大成功,得到了广泛使用[2-3] 。协同过滤的基本思想是,如果两个用户在一些项目上具有相似的评价信息,包括显示的直接评分信息或者点击、购买等隐式评价信息,则这两个用户具有相似兴趣。一般而言,协同过滤需要使用到的用户评价信息会被存储在一个数据表中,该表可以被称为用户评分矩阵。 协同过滤技术的关键在于计算两个用户或者项目的相 似度,然后根据相似的用户或者项目进行推荐。其中如果根据某一用户的评分数据寻找到与其相似的用户,并依据相似用户的爱好对活动用户进行推荐的思想被称为基于用户的协同过滤。如果知道用户对某一项目评分较高,则可以根据评分矩阵寻找与这一项目相似的项目推荐给用户,这种思想被称为基于项目的协同过滤。 两种协同过滤算法的基本步骤比较相似。首先,依据用 户对物品的评分建立用户评分矩阵,矩阵的行数为系统中用

基于协同过滤算法的电影推荐系统设计

高级数据挖掘期末大作业

基于协同过滤算法的电影推荐系统 本电影推荐系统中运用的推荐算法是基于协同过滤算法(Collaborative Filtering Recommendation)。协同过滤是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。 电影推荐系统中引用了Apache Mahout提供的一个协同过滤算法的推荐引擎Taste,它实现了最基本的基于用户和基于内容的推荐算法,并提供了扩展接口,使用户方便的定义和实现自己的推荐算法。 电影推荐系统是基于用户的推荐系统,即当用户对某些电影评分之后,系统根据用户对电影评分的分值,判断用户的兴趣,先运用UserSimilarity计算用户间的相似度.UserNeighborhood根据用户相似度找到与该用户口味相似的邻居,最后由Recommender提供推荐个该用户可能感兴趣的电影详细信息。将用户评过分的电影信息和推荐给该用户的电影信息显示在网页结果页中,推荐完成。 一、Taste 介绍 Taste是Apache Mahout 提供的一个个性化推荐引擎的高效实现,该引擎基于java实现,可扩展性强,同时在mahout中对一些推荐算法进行了MapReduce 编程模式转化,从而可以利用hadoop的分布式架构,提高推荐算法的性能。 在Mahout0.5版本中的Taste,实现了多种推荐算法,其中有最基本的基于用户的和基于内容的推荐算法,也有比较高效的SlopeOne算法,以及处于研究阶段的基于SVD和线性插值的算法,同时Taste还提供了扩展接口,用于定制化开发基于内容或基于模型的个性化推荐算法。 Taste 不仅仅适用于Java 应用程序,还可以作为内部服务器的一个组件以HTTP 和Web Service 的形式向外界提供推荐的逻辑。Taste 的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。 下图展示了构成Taste的核心组件:

基于在线评论情感分析的改进协同过滤推荐算法

第45卷 第6A 期 2018年6月 计算机科学COMPUTER SCIENCE Vol.45No.6A June 2018 本文受国家自然科学基金项目(71671121,11471152)资助.孙丽华(1979-),女,博士生,主要研究方向为个性化推荐算法,E-mail :sunlh68@t j u.edu.cn ;张兴芳(1957-) ,女,教授,主要研究方向为不确定性的数学理论与应用. 基于在线评论情感分析的改进协同过滤推荐算法 孙丽华1 张兴芳2 (天津大学管理与经济学部 天津300072)1 ( 聊城大学数学科学学院 山东聊城252000)2 摘 要 针对在线中文评论中用户主观意见的不确定性,提出了一种基于不确定理论的情感分析模型,并结合情感分析模型设计了一种个性化推荐算法.首先,采用分词工具ICTCLAS 和IKAnal y zer 预处理在线中文评论,并基于情感词典(HowNet )计算特征词的点互信息值;然后,应用不确定变量与不确定集设计情感分析模型;最后,根据情感分析模型设计搜索K 最近邻居的新方法,并产生推荐.实验结果表明,该方法能够有效提高推荐的准确率,缓解数据稀疏问题. 关键词 推荐算法,不确定统计,在线评论,情感分析中图法分类号 TP391 文献标识码 A Im p roved Collaborative Filterin g Recommendation Al g oritbm Based on Sentiment Anal y sis of Online Review SUN Li-hua 1 ZHANG Xin g -fan g 2 (Colle g e of Mana g ement and Economics ,Tian j in Universit y ,Tian j in 300072,China ) 1(School of Mathematical Sciences ,Liaochen g Universit y ,Liaochen g ,Shandon g 252000,China ) 2 Abstract Aimin g at the uncertaint y of users sub j ect o p inions in online Chinese review ,a sentiment anal y sis model based on uncertaint y theor y was p ro p osed.An individual recommendation al g orithm was desi g ned on the basis of the p ro p osed sentiment anal y sis model. First ,the tokenizers of ICTCLAS and IKAnal y zer was used to p re p rocess online Chinese review to g enerate characteristic words ,and the p oint mutual information value of characteristic words accoun-tin g for the sentiment direction were com p uted based on HowNet dictionar y .Then ,the sentiment anal y sis model was established via uncertaint y theor y of uncertain variables and uncertain sets.In addition ,the new similarit y formula based on the p ro p osed model was used to search the K-nearest nei g hbors.Finall y ,the recommendation lists were g iven.Ex p eri- mental results show that the p ro p osed method can effectivel y im p rove the accurac y of recommendation and alleviate the s p arse data p roblem. Ke y words Recommendation al g orithm ,Uncertain statistics ,Online review ,Sentiment anal y sis 1 引言 随着互联网的发展,电子商务逐步进入社会化商务时代,用户可以发布和获得网络信息的渠道日益增多. 以 协同过 滤 思想为基础的推荐技术[1] 很好地帮助用户提高了信息利 用率.基于用户或项目的协同过滤推荐算法,无论是在实际应用领域还是理论发展方面,都取得了丰富的成果.但是,在电子商务网站中,普遍存在数据稀疏问题,国内外一些学者通 过改进推荐算法来提高推荐精度[2-3] ,从而满足用户的需求. 然而,随着用户需求的不断细化,学者们发现评分数据中包含的信息量有限,不可避免地忽略了用户的某些特征信息,限制了推荐的精度. 在线评论是用户对项目使用经验的具体反馈,从评论信息中挖掘用户意见,无疑能完善用户偏好模型,提高推荐精度.由于自然语言本身具有不确定性,使得用户反馈的体验信息具有不确定性.为解决这类问题,现有文献多采用概率 [2] 或模糊 [4-5] 的方法.例如,Dra g oni 等 [6] 利用模糊的方法 刻画情感倾向,并将该方法应用到不同的领域来分析评论中的情感倾向性.Ha q ue 等 [7] 基于模糊逻辑的方法分析用户正 面或者负面的情绪来判断用户对产品的兴趣.Loia 等[8] 和 Wan g 等[9] 利用模糊的方法来识别文本中用户的情感倾向. Fu 等[12] 利用模糊方法从句子级别来研究情感分类, 提高了情感分类的准确性.因此,情感分析技术很快被应用到推荐 系统中[10-11].Fu 等[13] 结合评论信息来丰富用户的偏好信 息,利用HowNet 情感词典分析评论中用户的情感倾向,挖 掘用户情感倾向来提高推荐结果的准确性.De 等[2] 利用概率推断的方法从模糊观测的结果中改进协同过滤推荐算法, 提高推荐结果的精度. 然而,概率论和模糊数学中并没有涵盖所有的非确定性,例如,在情感分析过程中,分析用户的情感倾向是正向的程度或者是负向的程度;类似地,分析用户的情感强度是无法用工 具测量的.不确定理论[14]对这些问题给出了合理的解释,并对其做了进一步的完善[ 15] .可以利用不确定理论来更好地描述这些既不是随机也不是模糊的非确定问题. 本文针对在线中文评论中用户主观意见的不确定问题,建立了一种基于不确定理论的情感分析模型,并在此基础上设计了个性化推荐算法,以提高推荐结果的精度和缓解数据稀疏问题.最后,在Java 环境下,利用两个真实数据集验证 了该算法的有效性. 万方数据

基于用户的协同过滤推荐算法原理和实现

在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单。该算法1992年提出并用于邮件过滤系统,两年后1994年被GroupLens 用于新闻过滤。一直到2000年,该算法都是推荐系统领域最著名的算法。 本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其他你有可能感兴趣的人。 基本思想 俗话说“物以类聚、人以群分”,拿看电影这个例子来说,如果你喜欢《蝙蝠侠》、《碟中谍》、《星际穿越》、《源代码》等电影,另外有个人也都喜欢这些电影,而且他还喜欢《钢铁侠》,则很有可能你也喜欢《钢铁侠》这部电影。 所以说,当一个用户A 需要个性化推荐时,可以先找到和他兴趣相似的用户群体G,然后把G 喜欢的、并且A 没有听说过的物品推荐给A,这就是基于用户的系统过滤算法。 原理 根据上述基本原理,我们可以将基于用户的协同过滤推荐算法拆分为两个步骤: 1. 找到与目标用户兴趣相似的用户集合 2. 找到这个集合中用户喜欢的、并且目标用户没有听说过的物品推荐给目标用户1. 发现兴趣相似的用户 通常用Jaccard 公式或者余弦相似度计算两个用户之间的相似度。设N(u) 为用户u 喜欢的物品集合,N(v) 为用户v 喜欢的物品集合,那么u 和v 的相似度是多少呢: Jaccard 公式: 余弦相似度:

假设目前共有4个用户:A、B、C、D;共有5个物品:a、b、c、d、e。用户与物品的关系(用户喜欢物品)如下图所示: 如何一下子计算所有用户之间的相似度呢?为计算方便,通常首先需要建立“物品—用户”的倒排表,如下图所示: 然后对于每个物品,喜欢他的用户,两两之间相同物品加1。例如喜欢物品a 的用户有A 和B,那么在矩阵中他们两两加1。如下图所示:

浅谈基于协同过滤的个性化推荐算法

浅谈基于协同过滤 算法的个性化推荐 姓名: 学号: 班级: 学院: 年月日

摘要 协同过滤是如今推荐系统中最为成熟的的一个推荐算法系类,是利用群体的喜好来推测使用者的喜好,从而向用户产生推荐的算法。当前协同过滤算法大致可以分为基于用户的协同过滤算法和基于项目的协同过滤算法。协同过滤为主要算法的推荐系统的应用领域日益广泛,电子商务是其应用的最主要和最成功的领域。但协同过滤算法仍具有很多不足之处,最突出的不足分别是数据稀疏性问题,冷启动问题和系统延伸性问题。在已有的理论和实践研究基础上,个人提出了协同过滤推荐值得深入研究的方向应包括多维数据的交叉利用,从而提高协同过滤推荐的精准度。 关键字:协同过滤推荐,基于用户,基于项目,数据稀疏,冷启动,系统延 伸性,多维数据的交叉利用 正文 一、协同过滤推荐的基本定义 (一)协同过滤推荐的概念 协同过滤是如今推荐系统中最为成熟的的一个推荐算法系类,简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的资讯,个人透过合作的机制给予资讯相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选资讯,回应不一定局限于特别感兴趣的,特别不感兴趣资讯的纪录也相当重要。 (二)协同过滤推荐的主要算法概述 当前协同过滤算法大致可以分为两类,一类是基于用户的协同过滤算法,一类是基于项目的协同过滤算法。 基于用户的协同过滤推荐根据相似用户群的观点来产生对目标用户的推荐。基本思想是如果某些用户对部分项目的评分趋于一致或是很接近,可以认为他们对其它项目的评分差异就比较小,进一步,可以使用这些相似用户的项目评分值对目标用户的未评分项目进行估计。基于用户的协同过滤使用数理统计的方法来寻找与目标用户有相似兴趣偏好的最近邻居用户集合,再以最近邻居用户对特定项目的评分为基础使用一定的数学方法来预测目标用户对该特定项目的评分,而预测评分最高的前N个商品可以看作是用户最有可能感兴趣top-N商品返回给目标用户(这就是所谓的top-N推荐)。基于用户的协同过滤推荐算法的核心思想是利用数理统计的方法为目标用户寻找他的最近邻居用户集,再以最近邻居用户对特定项目的评分为基础使用一定的数学方法来预测目标用户对该特定项目的评分,最终产生最后的推荐结果。通过最近邻居用户对目标用户未评分项目的评分值进行加权平均来逼近,这是该算法思想的关键。基于用户的协同过滤推荐算法的主要工作有:用户之间相似性的衡量、最近邻居集的查找和评分预测值的计算。 和基于用户的协同过滤相比,基于项目的协同过滤推荐算法的思想出发点是完全相反的,但是计算方法一致。基于项目的协同过滤推荐算法是根据用户对与

协同过滤推荐算法与应用

机器学习算法day03_协同过滤推荐算法及应用课程大纲 课程目标: 1、理解协同过滤算法的核心思想 2、理解协同过滤算法的代码实现 3、掌握协同过滤算法的应用步骤:数据处理、建模、运算和结果判定

4、 1. CF协同过滤推荐算法原理 1.1 概述 什么是协同过滤(Collaborative Filtering, 简称CF)? 首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做? 大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。 协同过滤算法又分为基于用户的协同过滤算法和基于物品的协同过滤算法 1.2 案例需求 如下数据是各用户对各文档的偏好: 现在需要基于上述数据,给A用户推荐一篇文档

1.3 算法分析 1.3.1 基于用户相似度的分析 直觉分析:“用户A/B”都喜欢物品A和物品B,从而“用户A/B”的口味最为相近 因此,为“用户A”推荐物品时可参考“用户B”的偏好,从而推荐D 这种就是基于用户的协同过滤算法UserCF指导思想 1.3.2 基于物品相似度的分析 直觉分析:物品组合(A,D)被同时偏好出现的次数最多,因而可以认为A/D两件物品的相似度最高,从而,可以为选择了A物品的用户推荐D物品

这种就是基于物品的协同过滤算法ItemCF指导思想 1.4 算法要点 1.4.1、指导思想 这种过滤算法的有效性基础在于: 1、用户偏好具有相似性,即用户可分类。这种分类的特征越明显,推荐准确率越高 2、物品之间具有相似性,即偏好某物品的人,都很可能也同时偏好另一件相似物品 1.4.2、两种CF算法适用的场景 什么情况下使用哪种算法推荐效果会更好? 不同环境下这两种理论的有效性也不同,应用时需做相应调整。 a.如豆瓣上的文艺作品,用户对其的偏好程度与用户自身的品位关联性较强;适合UserCF b.而对于电子商务网站来说,商品之间的内在联系对用户的购买行为影响更为显著。 1.5 算法实现 总的来说,要实现协同过滤,需要一下几个步骤: 1.收集用户偏好 2.找到相似的用户或物品 3.计算推荐

基于用户-项目特征的协同过滤推荐改进算法

基于用户-项目特征的协同过滤推荐改进算法 朱 珠,辜丽川,舒贵阳,冯娟娟,王 超,陈 卫 ( 安徽农业大学 信息与计算机学院,安徽 合肥 230036 ) 摘 要:基于用户的协同过滤推荐算法是当前使用范围最广的推荐算法之一。传统的协同过滤推荐算法仅依靠用户对项目的打分记录,数据稀疏度高而且来源单一,对用户间相似度测算的可信度影响较大。针对这一问题,引入用户画像信任度和类别评分差异度两个概念,对传统基于用户的协同过滤推荐算法进行改进,提出一种多维用户相似性计算方法,该算法通过调节用户画像信任度和类别评分差异度在用户相似性计算中的贡献系数,进而影响推荐算法评价指标MAE 的变化,实验结果表明,新算法较原算法在命中率和准确率上有较大提高。 关键词:用户画像; 项目类别; 相似性; 协同过滤 中图分类号:TP399 文献标识码:A 文章编号:1673-9639 (2017) 09-0015-05 协同过滤推荐算法[1-2]是应用最为广泛的推荐方法之一,在亚马逊网、Netflix 、YouTube 等在线电子商务[3]、移动应用[4]等领域作为个性化信息服务的解决方案,都有较为成功的应用。随着数据量增大,用户对项目的打分数量有限,每个用户的打分数量通常小于整体待评分项目的1‰,用户-项目打分矩阵数据稀疏等级高,数据重叠性低,严重制约了用户间相似度测算的可信度,降低了推荐算法的性能。因此,如何通过用户相似性计算为目标用户过滤出可靠的邻居用户成为算法亟待解决的关键问题。 为解决数据稀疏性问题,赵琴琴等[3]依据用户-项目评分矩阵,通过相似度传播,为目标用户寻找更多、更可靠的邻居,并分别从用户和项目两方面寻找用户、项目的相似性。胡勋等[5]为提高基于共同评分项目的用户相似度计算精度,使用推土机距离实现跨项目的移动用户相似度计算,提出一种将移动用户信任关系与项目评分特融合的协同过滤推荐算法; 贾冬艳等基于用户相似度计算的结果,动态选取目标用户的兴趣相似集,并依据用户评分信息计算目标用户与兴趣相似用户的信任度,实现双重邻居选取[1]。 以上处理方式在一定程度上缓和了数据稀疏性问题,但这些方式的数据来源单一,仅依赖于用户对项目的行为记录,没有考虑用户和项目自身特征差异对相似性的影响,用户信任度稳定性较低,往往导致推荐结果的准确率和命中率降低。为解决上述问题,本文引入“用户画像”和“用户对同一类别项目的评分量”两个度量因子,提出一种改进相似度的协同过滤推荐算法,实验结果证明该方法在准确度等方面有较大改善。 1.相关概念 1.1.度量相似性 1.1.1.余弦相似性 将用户i 和用户j 的评分向量视为n 维空间向 收稿日期:2017-03-22 基金项目:国家自然科学基金项目(31371533);安徽省重大科技专项(16030701092);安徽农业大学2015年度教育改革与发 展研究项目(18)。 作者简介:朱 珠(1992-),女,安徽六安人,硕士,研究方向:数据挖掘、机器学习等。 第19卷 第9期 铜仁学院学报 V ol. 19, No. 92017年 9 月 Journal of Tongren University Sep. 2017

基于协同过滤算法的电影推荐系统

基于协同过滤算法的电影推荐系统

————————————————————————————————作者:————————————————————————————————日期:

高级数据挖掘期末大作业

基于协同过滤算法的电影推荐系统 本电影推荐系统中运用的推荐算法是基于协同过滤算法(Collaborative Filtering Recommendation)。协同过滤是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。 电影推荐系统中引用了Apache Mahout提供的一个协同过滤算法的推荐引擎Taste,它实现了最基本的基于用户和基于内容的推荐算法,并提供了扩展接口,使用户方便的定义和实现自己的推荐算法。 电影推荐系统是基于用户的推荐系统,即当用户对某些电影评分之后,系统根据用户对电影评分的分值,判断用户的兴趣,先运用UserSimilarity计算用户间的相似度.UserNeighborhood根据用户相似度找到与该用户口味相似的邻居,最后由Recommender提供推荐个该用户可能感兴趣的电影详细信息。将用户评过分的电影信息和推荐给该用户的电影信息显示在网页结果页中,推荐完成。 一、Taste 介绍 Taste是Apache Mahout 提供的一个个性化推荐引擎的高效实现,该引擎基于java实现,可扩展性强,同时在mahout中对一些推荐算法进行了MapReduce 编程模式转化,从而可以利用hadoop的分布式架构,提高推荐算法的性能。 在Mahout0.5版本中的Taste,实现了多种推荐算法,其中有最基本的基于用户的和基于内容的推荐算法,也有比较高效的SlopeOne算法,以及处于研究阶段的基于SVD和线性插值的算法,同时Taste还提供了扩展接口,用于定制化开发基于内容或基于模型的个性化推荐算法。 Taste 不仅仅适用于Java 应用程序,还可以作为内部服务器的一个组件以HTTP 和Web Service 的形式向外界提供推荐的逻辑。Taste 的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。 下图展示了构成Taste的核心组件:

基于用户协同过滤算法的电影推荐系统

基于用户协同过滤算法的电影推荐系统 摘要 随着电子商务的高速发展和普及应用,个性化推荐的推荐系统已成为一个重要研究领域。个性化推荐算法是推荐系统中最核心的技术,在很大程度上决定了电子商务推荐系统性能的优劣。协同过滤是应用最为广泛的一种个性化推荐技术。协同过滤主要分为基于用户的协同过滤和基于项目的协同过滤。 本文研究了基于用户的协同过滤推荐算法及其在电影推荐系统中的应用,设计开发了相应的电影推荐系统中个性化推荐原型系统,并对该算法的推荐质量进行了深入的实验分析。本文也介绍了协同过滤推荐的基本思想。在介绍电影推荐系统推荐技术研究与应用现状的基础上,详细说明了基于用户的协同过滤推荐算法及其具体实现步骤。采用Java Web 实现了原型系统。对于挖掘结果从算法效率及应用意义上进行比较分析 关键词:电影基于用户的协同过滤推荐余弦相似性相关相似性

目录 基于用户协同过滤算法的电影推荐系统 (1) 摘要 (1) 第 1 章绪论 (3) 1.1、研究背景 (3) 1.2、国际发展形势 (4) 第 2 章基于用户协同过滤推荐技术 (5) 2.1 电子商务推荐系统概述 (5) 2.2 协同过滤推荐技术 (5) 第 3 章基于用户的协同过滤推荐算法 (7) 3.1 基于用户协同过滤算法的介绍 (7) 3.2、基于用户喜好值推荐算法的思路 (7) 3.2.1 建立用户模型 (7) 3.2.2 寻找最近邻居 (8) 3.3 算法的实现 (9) 3.4 电影推荐系统界面实现 (10) 第 4 章算法推荐质量的实验分析 (11) 4.1 算法推荐质量的衡量方法 (11) 4.2 验证推荐方法采用的数据集 (11) 4.3 实验结果分析 (12) 4.3.1 余弦相似性 (12) 4.3.2 相似相关性 (13) 4.3.3 基于用户评分次数的相似相关性计算方法 (14) 4.3.4 两种算法的对比分析 (15) 第五章总结 (16) 参考文献 (17) 附录 (18)

基于用户的协同过滤算法

基于用户的协同过滤算法 作者:罗沐阳(2012101020028) 指导教师:张勇 【摘要】:随着网络技术的应用和普及、电子商务的迅猛发展,越来越多的信息充斥在网络之上。如何在众多的资源中找到适合自己需求的信息,成为众多学者、专家和网络用户火心的核心问题之一。个性化推荐技术在这样的背景下应运而生。协同过滤技术是个性化推荐技术最为核心的技术之一,也是目前应用最为广泛和成功的技术。本文主要研究的是基于用户的协同过滤推荐算法的实现。 【关键词】:协同过滤,相似度,个性化推荐 1.电子商务个性化推荐技术 1.1个性化推荐技术 电子商务对传统的商务交易产生了革命性的变化,从而要求“以产品为中心”向“面向客户”、“以客户为中心”的新的商业模式的转变,要求电子商务网站按客户群划分产品,围绕客户进行服务,为客户提供所需要的东西,所以对每个顾客提供个性化的服务成为必要。在这种背景下,推荐系统(Recommender System)应运而生,它是根据用户个人的喜好、习惯来向其推荐信息、商品的程序。电子商务网站可以使用推荐系统分析客户的消费偏好,向每个客户具有针对性地推荐产品,帮助用户从庞大的商品目录中挑选真正适合自己需要的商品,尽可能为每个顾客提供个性化的服务。 个性化推荐(personalized recommendation)技术通过研究不同用户的兴趣,主动为用户推荐最需要的资源,从而更好地解决互联网信息日益庞大与用户需求之间的矛盾。目前,推荐技术被广泛应用到电子商务、数字图书馆、新闻网站等系统中。因此,各种适用于推荐系统的技术应运而生,如协同过滤技(CF)、bayesian网技术、聚类分析技术、关联规则技术、神经网络技术和图模型技术等,其中,协同过滤是应用最为广泛的个性化推荐技术。协同过滤推荐又分为基于模型(Model-based)的协同过滤和基于用户的协同过滤。后来,sarwr 教授在2001年提出基于项目的协同过滤算法 1.2协同过滤 协同过滤推荐技术是用“相似统计”的方法发现具有相似偏好或是兴趣特征的“相邻用户”。“协同过滤”的思想最早由美国明尼苏达州大学的学者Paul Resnick在1994年,发表的《GroupLens: AnOpen Architecture for Collaborative Filtering of Netnews》一文中提出的。迄今为止, 协同过滤是在个性化推荐系统中应用最广泛和最被人们所认可的一种推荐技术。 协同过滤的基本原理是:根据用户对信息产品的评分情况,对其他用户进行检索, 找出与该用户“品味”相似的一小群人, 也就是“邻居”,然后再基于这些相似性进行信息产品评分预测,产生Top-N的推荐结果。

基于协同过滤算法的推荐系统设计

基于协同过滤算法的推荐系统设计 一、绪论: 长尾理论。 二、协同过滤算法的定义: (一)预定义: 要实现协同过滤算法,需要做以下的预定义: 1、邻域: 给定集合X,映射U:X→P(P(X))(其中P(P(X))是X的幂集的幂集),U 将X中的点x映射到X的子集族U(x)),称U(x)是X的邻域系以及U(x)中的元 素(即X的子集)为点x的邻域,当且仅当U满足以下的邻域公理: U1:若集合A∈U(x),则x∈A。 U2:若集合A,B∈U(x),则A∩B∈U(x)。 U3:若集合A∈U(x),且A ?B ?X,则B∈U(x)。 U4:若集合A∈U(x),则存在集合B∈U(x),使B ?A,且?y∈B,B∈U(y)。 2、皮尔逊相关系数: 皮尔逊相关系数是一种度量两个变量相似程度的一种方法,若变量X和变量Y线性相关,则其皮尔逊系数的z值域为[-1,1]。系数值为1表示完全正相关; 系数值为-1表示完全负相关。 3、曼哈顿距离: 4、欧几里得距离: 5、余弦相似度: 6、 Jaccard相似度: (二)基于用户的协同过滤算法: 在实际应用中,如果一个用户C需要得到个性化的推荐,那么根据这个用户过去喜欢过的物品,计算出与这个顾客有着相似偏好的用户,继而把这些相似的用户所喜欢的、且C没有喜好过的物品推荐给用户C,这就是基于用户的协同过滤算法的主要思路。 该方法主要包括两个步骤: 1、寻找和查询用户具有相似偏好的用户群体。 2、找到这些用户所喜欢的物品集合,选取其中用户最为感兴趣的子集推荐给 查询用户。 在步骤1中,我们使用相似度来度量两个用户之间的相似度。相似度的计算方法可以调用预定义中的皮尔逊相似度、余弦相似度、曼哈顿距离、欧几里得距离和jaccard相似度。记用户A和用户B之间的相似度为sim 在得到用户的相似度之后,我们需要给查询用户返回根据其兴趣度的T opK结果,我们用如下公式衡量用户的兴趣度: 公式 其中S(u,K)代表相似用户集中的前K个用户,N(i)代表喜欢物品i的用户集合。 R代表用户u对物品i的感兴趣程度。 下图代表基于用户协同过滤算法的主要流程: (三)基于物品的协同过滤算法: 在基于用户的协同过滤算法的基础上,又发展出了基于物品的协同过滤算法。 这主要是因为在一般的网站应用中,用户的数量往往远远大于物品的数量,这就造 成了计算用户之间的相似度成为一件非常耗时的工作:以余弦相似度为例。设一个

基于项目的协同过滤推荐算法

基于项目的协同过滤推荐算法采用统计技术来寻找与目标项目有相似评分的邻居项目,再基于邻居项目的评分数据预测目标项目的评分,从而选择预测评分最高的前若干项推荐给目标用户。整个算法基于用户一项目评分矩阵R ( m, n}进行。R( m, n}是一个mxn阶矩阵,m行表示m个用户,n列表示n个项目,矩阵,表示用户i对项目j的评分数据。 元素值R i ,j 一般情况下,网站用户数量增长比较快,而待评价项目比较稳定,因此计算出的项目相似度矩阵的更新频率比较低,所以此矩阵可以使用较长时间。基于项目的协同过滤推荐算法认为,用户对不同项目的评分具有相似性,先计算项目之间的相似性,当需要估计用户对某一项目的评分时,可以参照用户对其他项目的评分来进行判断[11]。 和基于用户的协同过滤推荐算法相似,该算法也分为三步: (1)建立用户—项目矩阵 M表示有m个用户,n为项目数量,矩阵中的R ij表示用户i对项目j的评价,可选取一定的范围数字表示。 (2)获取目标用户邻居 根据用户—项目矩阵,计算目标项目与其他项目的相似度,获得目标项目的项目邻居列表,其中,项目的相似度可根据上文提到的余弦相似性,皮尔森相似系数以及修正的余弦相似系数计算出来,从而采用TOP-N算法产生最近邻居集[2]。 (3)进行推荐 根据邻居对项目的评分来预测目标用户对项目的评分,可采用下面的一个公式:

U为邻居用户集,sim(T,n)表示目标项目与最近邻居的相似性,Ru, n表示用户u 对项目n 的评分; RT 和Rn 分别表示对项目T 和项目n的平均评分[11]。 基于项目的协同过滤推荐技术可以对基于一些复杂的,难以表达的概念(信息质量、品位)进行过滤,同时也可以推荐一些新特性。 但是,由于大型电子商务站点用户及商品项的数量庞大且不断增加,使得R ( m, n}成为高维矩阵,’用户给予评分的商品项很少,通常在1%以下[3j,导致R ( m, n}中的评分数据极端稀疏。因此,基于项目的协同过滤推荐算法面临严峻的用户评分数据稀疏性的挑战[m。文献[8了在其提出的优化算法中考虑到了项目的类别相似性,但只涉及项目的第1层分类,而未能扩展到实际商品在多类别多层次上的相似性。本文提出了计算项目类别相似性的方法,并将其与传统的项目评分相似性相结合,进一步求得项目综合相似性,从而提高最近邻居项目的搜寻准确度,同时也缓解了用户评分数据稀疏性问题。 2 基于项目的协同过滤推荐算法的不足 对于项目i、j之间的评分相似性simR(i,j),基于项目的协同过滤推荐算法主要采用以下3种方法进行度量:

相关文档
最新文档