协同过滤(Collaborative Filtering,简称CF)推荐算法是诞生最先,而且较为著名的推荐算法。主要的功能是预测和推荐。算法经过对用户历史行为数据的挖掘发现用户的偏好,基于不一样的偏好对用户进行群组划分并推荐品味类似的商品。协同过滤推荐算法分为两类,分别是基于用户的协同过滤算法(user-based collaboratIve filtering),和基于物品的协同过滤算法(item-based collaborative filtering)。简单的说就是:人以类聚,物以群分。下面咱们将分别说明这两类推荐算法的原理和实现方法。算法
1、基于用户的协同过滤算法(user-based collaboratIve filtering)网站
基于用户的协同过滤算法是经过用户的历史行为数据发现用户对商品或内容的喜欢(如商品购买,收藏,内容评论或分享),并对这些喜爱进行度量和打分。根据不一样用户对相同商品或内容的态度和偏好程度计算用户之间的关系。在有相同喜爱的用户间进行商品推荐。简单的说就是若是A,B两个用户都购买了x,y,z三本图书,而且给出了5星的好评。那么A和B就属于同一类用户。能够将A看过的图书w也推荐给用户B。spa
一、寻找偏好类似的用户.net
咱们模拟了5个用户对两件商品的评分,来讲明如何经过用户对不一样商品的态度和偏好寻找类似的用户。在示例中,5个用户分别对两件商品进行了评分。这里的分值可能表示真实的购买,也能够是用户对商品不一样行为的量化指标。例如,浏览商品的次数,向朋友推荐商品,收藏,分享,或评论等等。这些行为均可以表示用户对商品的态度和偏好程度。3d
从表格中很难直观发现5个用户间的联系,咱们将5个用户对两件商品的评分用散点图表示出来后,用户间的关系就很容易发现了。在散点图中,Y轴是商品1的评分,X轴是商品2的评分,经过用户的分布状况能够发现,A,C,D三个用户距离较近。用户A(3.3 6.5)和用户C(3.6 6.3),用户D(3.4 5.8)对两件商品的评分较为接近。而用户E和用户B则造成了另外一个群体。code
散点图虽然直观,但没法投入实际的应用,也不能准确的度量用户间的关系。所以咱们须要经过数字对用户的关系进行准确的度量,并依据这些关系完成商品的推荐。blog
欧几里德距离评价排序
欧几里德距离评价是一个较为简单的用户关系评价方法。原理是经过计算两个用户在散点图中的距离来判断不一样的用户是否有相同的偏好。如下是欧几里德距离评价的计算公式。ip
经过公式咱们得到了5个用户相互间的欧几里德系数,也就是用户间的距离。系数越小表示两个用户间的距离越近,偏好也越是接近。不过这里有个问题,过小的数值可能没法准确的表现出不一样用户间距离的差别,所以咱们对求得的系数取倒数,使用户间的距离约接近,数值越大。在下面的表格中,能够发现,用户A&C用户A&D和用户C&D距离较近。同时用户B&E的距离也较为接近。与咱们前面在散点图中看到的状况一致。博客
皮尔逊相关度评价
皮尔逊相关度评价是另外一种计算用户间关系的方法。他比欧几里德距离评价的计算要复杂一些,但对于评分数据不规范时皮尔逊相关度评价可以给出更好的结果。如下是一个多用户对多个商品进行评分的示例。这个示例比以前的两个商品的状况要复杂一些,但也更接近真实的状况。咱们经过皮尔逊相关度评价对用户进行分组,并推荐商品。
皮尔逊相关系数
皮尔逊相关系数的计算公式以下:
结果是一个在-1与1之间的系数。该系数用来讲明两个用户间联系的强弱程度。
相关系数的分类:
经过计算5个用户对5件商品的评分咱们得到了用户间的类似度数据。这里能够看到用户A&B,C&D,C&E和D&E之间类似度较高。下一步,咱们能够依照类似度对用户进行商品推荐。
这里同时给出计算皮尔逊系数的py脚本:
from math import sqrt def multipl(a, b): sumofab = 0.0 for i in range(len(a)): temp = a[i] * b[i] sumofab += temp return sumofab def corrcoef(x, y): n = len(x) # 求和 sum1 = sum(x) sum2 = sum(y) # 求乘积之和 sumofxy = multipl(x, y) # 求平方和 sumofx2 = sum([pow(i, 2) for i in x]) sumofy2 = sum([pow(j, 2) for j in y]) num = sumofxy - (float(sum1) * float(sum2) / n) # 计算皮尔逊相关系数 den = sqrt((sumofx2 - float(sum1 ** 2) / n) * (sumofy2 - float(sum2 ** 2) / n)) return num / den x = [3.3, 6.5, 2.8, 3.4, 5.5] y = [5.6, 3.3, 4.5, 5.2, 3.2] print(corrcoef(x, y))
二、为类似的用户提供推荐物品
假设咱们要为用户C推荐:当咱们须要对用户C推荐商品时,首先咱们检查以前的类似度列表,发现用户C和用户D和E的类似度较高。换句话说这三个用户是一个群体,拥有相同的偏好。所以,咱们能够对用户C推荐D和E的商品。但这里有一个问题。咱们不能直接推荐前面商品1-商品5的商品。由于这这些商品用户C以及浏览或者购买过了。不能重复推荐。所以咱们要推荐用户C尚未浏览或购买过的商品。
加权排序推荐
咱们提取了用户D和用户E评价过的另外5件商品A—商品F的商品。并对不一样商品的评分进行类似度加权。按加权后的结果对5件商品进行排序,而后推荐给用户C。这样,用户C就得到了与他偏好类似的用户D和E评价的商品。而在具体的推荐顺序和展现上咱们依照用户D和用户E与用户C的类似度进行排序。
以上是基于用户的协同过滤算法。这个算法依靠用户的历史行为数据来计算相关度。也就是说必需要有必定的数据积累(冷启动问题)。对于新网站或数据量较少的网站,还有一种方法是基于物品的协同过滤算法。
2、基于物品的协同过滤算法(item-based collaborative filtering)
基于物品的协同过滤算法与基于用户的协同过滤算法很像,将商品和用户互换。经过计算不一样用户对不一样物品的评分得到物品间的关系。基于物品间的关系对用户进行类似物品的推荐。这里的评分表明用户对商品的态度和偏好。简单来讲就是若是用户A同时购买了商品1和商品2,那么说明商品1和商品2的相关度较高。当用户B也购买了商品1时,能够推断他也有购买商品2的需求。
一、寻找类似的物品
表格中是两个用户对5件商品的评分。在这个表格中咱们用户和商品的位置进行了互换,经过两个用户的评分来得到5件商品之间的类似度状况。单从表格中咱们依然很难发现其中的联系,所以咱们选择经过散点图进行展现。
在散点图中,X轴和Y轴分别是两个用户的评分。5件商品按照所获的评分值分布在散点图中。咱们能够发现,商品1,3,4在用户A和B中有着近似的评分,说明这三件商品的相关度较高。而商品5和2则在另外一个群体中。
欧几里德距离评价
在基于物品的协同过滤算法中,咱们依然可使用欧几里德距离评价来计算不一样商品间的距离和关系。如下是计算公式。
经过欧几里德系数能够发现,商品间的距离和关系与前面散点图中的表现一致,商品1,3,4距离较近关系密切。商品2和商品5距离较近。
皮尔逊相关度评价
咱们选择使用皮尔逊相关度评价来计算多用户与多商品的关系计算。下面是5个用户对5件商品的评分表。咱们经过这些评分计算出商品间的相关度。
皮尔逊相关度计算公式
经过计算能够发现,商品1&2,商品3&4,商品3&5和商品4&5类似度较高。下一步咱们能够依据这些商品间的相关度对用户进行商品推荐。
二、为用户提供基于类似物品的推荐
这里咱们遇到了和基于用户进行商品推荐相同的问题,当须要对用户C基于商品3推荐商品时,须要一张新的商品与已有商品间的类似度列表。在前面的类似度计算中,商品3与商品4和商品5类似度较高,所以咱们计算并得到了商品4,5与其余商品的类似度列表。
如下是经过计算得到的新商品与已有商品间的类似度数据。
加权排序推荐
这里是用户C已经购买过的商品4,5与新商品A,B,C直接的类似程度。咱们将用户C对商品4,5的评分做为权重。对商品A,B,C进行加权排序。用户C评分较高而且与之类似度较高的商品被优先推荐。
转自博客:https://blog.csdn.net/yimingsilence/article/details/54934302 作略微修改