本文是个人在学习过程中的总结,如有错误或者不全面的地方,请大家指正,谢谢!

一、 协同过滤算法简介

二、 基于用户的协同过滤算法

2.1 实例

2.2 相似度计算方式

2.2.1 余弦相似度

2.2.2 杰卡德相似系数

2.2.3 皮尔逊相关系数

2.3 最终结果预测

三、 基于物品的协同过滤算法

四、 上代码

4.1 UserCF

4.2 ItemCF

五、 协同过滤算法的问题分析

5.1 稀疏性问题

5.2 冷启动问题

5.3 可扩展性问题


一、 协同过滤算法简介

协同过滤算法是一个经典的推荐算法。它的基本思想是通过对用户历史行为数据的挖掘来发现用户的喜好偏向,基于不同的喜好偏向对用户进行划分并向用户推荐其可能喜好的产品。举个简单的例子,当我们出去买饮品的时候,我们通常会询问身边的朋友有没有推荐的,而我们一般更倾向于同我们口味类似的朋友那里得到推荐。这就是协同过滤的核心思想。

协同过滤算法分为两类,分别是

基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品类似的物品

基于用户的协同过滤算法:给用户推荐与他兴趣相似的其他用户喜欢的物品

二、 基于用户的协同过滤算法

人以群分:找到与该用户具有相似兴趣其他用户,将他们喜欢的但是该用户未曾见过的物品推荐给该用户。

基于用户的协同过滤算法主要分为两个步骤:

(1)找到与用户A具有相似兴趣爱好的用户B,即计算用户之间的相似度;

(2)将用户B喜欢的但是用户A未曾见过的物品推荐给用户A。

2.1 实例

下面给大家举个例子具体看一下

给用户推荐物品的过程可以形象的理解为上述用户对物品的喜欢程度,打分越高,说明用户对这个物品越喜欢。

UserCF的两个步骤

首先根据已有用户的打分情况计算一下用户1和用户 2, 3, 4,5的相似度, 找出与用户1最相似的 n 个用户;

然后根据这 n 个用户对物品5的评分情况和与用户1的相似程度计算出用户1对物品5的评分, 如果评分比较高的话, 就把物品5推荐给用户1, 否则不推荐。

2.2 相似度计算方式

计算相似度需要根据数据特点的不同选择不同的计算方法,下面给大家介绍三种常用的相似度计算方法:

2.2.1 余弦相似度

余弦相似度同样适用于n维向量,可以表示为

2.2.2 杰卡德相似系数

集合A和B交集元素的个数在A、B并集中所占的比例,称为两个集合的杰卡德系数,用符号 J(A,B) 表示。杰卡德相似系数是衡量两个集合相似度的一种指标,jaccard值越大说明相似度越高。

2.2.3 皮尔逊相关系数

相比余弦相似度,皮尔逊相关系数通过使用用户平均分对各独立评分进行修正,减小了用户评分偏置的影响。公式为:

公式中, 代表用户1对物品k的评分, 代表该用户对所有物品的平均分。

2.3 最终结果预测

根据上面的三种方法,我们可以计算出向量之间的相似度,也就是可以计算出用户与用户之间的相似度。这时候我们就可以选出与用户1最相近的n个用户, 基于他们对物品5的评价计算出打分值, 那么如何进行计算呢?

常用的计算方式也有很多,下面直接给大家介绍一种考虑更为全面的计算方式,利用用户相似度和该物品的评分与此用户的所有评分的差值进行加权平均。该公式考虑到了有的用户内心的评分标准不一的情况, 即有的用户喜欢打高分, 有的用户喜欢打低分的情况。公式如下

下面对上面的例子具体实操一下

(1)计算用户1与其他四个用户的相似性(使用皮尔逊相关系数):

用户1与用户2的余弦相似度:

用户1与用户2的皮尔逊相关系数:

user1(5,3,4,4)       user2(3,1,2,3)

user1_ave = 4                    user2_ave = 2.25

用各自的向量减去各自的平均值:

user1(1,-1,0,0)       user2(0.75,-1.25,-0.25,0.75)

计算他们的余弦相似度:

根据以上计算得出用户1与用户2的相似度为0.85,同样方式可以计算出用户1与用户3、用户4、用户5的相似度分别为0.7,0,-0.79。如果n=2的话,那么与用户1最相似的两个用户为用户2和用户3,相似度分别为0.85和0.7

(2)根据相似度用户计算用户1对物品5的最终得分

用户2对物品5的评分是3, 用户3对物品5的打分是5, 那么根据上面的计算公式, 可以计算出用户1对物品5的最终得分是

(3)根据评分对用户进行推荐

由上述计算得,用户1对物品5的评分为4.87,根据用户1的评分得出物品推荐序列为

物品1>物品5>物品3=物品4>物品2

所以,如果要向用户1推荐两款物品,我们可以推荐物品1和物品5.

三、 基于物品的协同过滤算法

物以类聚:预先根据其他用户的偏好数据计算出每个物品最相似的物品列表,然后为用户推荐与喜欢物品相类似的物品。

基于物品的协同过滤算法主要分为两个步骤:

(1)计算物品之间的相似度

(2)根据物品的相似度和用户的历史行为给用户生成推荐列表。

基于物品的协同过滤算法跟基于用户的协同过滤算法计算过程类似,因此我们继续使用上述例子进行计算。

算法步骤为:

(1)首先计算一下物品5和物品1, 2, 3, 4之间的相似度

物品向量:

item1(3,4,3,1);item2(1,3,3,5);item3(2,4,1,5);item4(3,3,5,2)

item5(3,5,4,1)

物品5与物品1的余弦相似度:

物品5与物品1的皮尔逊相关系数:

item1_ave = 2.75                item5_ave = 3.25

用各自的向量减去各自的平均值:

item1(0.25,1.25,0.25,-1.75)          item5(-0.25,1.75,0.75,-2.25)

计算他们的余弦相似度(同上述相似度计算公式,直接代入即可)

根据以上计算得出物品5和物品1的相似度为0.9694,同样方式计算出物品5和物品2、物品3、物品4的相似度分别为:-0.478、-0.4276、0.5816。如果n=2的话,那么与物品5最相似的两个物品为物品1和物品4,相似度分别为0.9694和0.5816。

(2)计算对物品5的打分情况

(3)根据评分对用户进行推荐

由上述计算得,用户1对物品5的评分为4.6,根据用户1的评分得出物品推荐序列为

物品1>物品5>物品3=物品4>物品2

所以,如果要向用户1推荐两款物品,我们可以向用户1推荐物品1和物品5。

四、 上代码

4.1 UserCF

1、先建立数据表

def loadData():users = {'user1': {'1': 5, '2': 3, '3': 4, '4': 4},'user2': {'1': 3, '2': 1, '3': 2, '4': 3, '5': 3},'user3': {'1': 4, '2': 3, '3': 4, '4': 3, '5': 5},'user4': {'1': 3, '2': 3, '3': 1, '4': 5, '5': 4},'user5': {'1': 1, '2': 5, '3': 5, '4': 2, '5': 1}}return users

2、计算用户相似性矩阵

user_data = loadData()
similarity_matrix = pd.DataFrame(np.identity(len(user_data)), # identity函数用于一个n*n的单位矩阵(主对角线元素全为1,其余全为0的矩阵)。index=user_data.keys(),columns=user_data.keys(),
)# 遍历每条用户-物品评分数据
for u1, items1 in user_data.items():for u2, items2 in user_data.items():# 跳过user相同的情况,为1if u1 == u2:continuevec1, vec2 = [], []# 遍历user1的所有itemsfor item, rating1 in items1.items():# 与user2相应的itemrating2 = items2.get(item, -1) # dict的getif rating2 == -1:continuevec1.append(rating1)vec2.append(rating2)# 利用user1和user2的items,计算不同用户之间的皮尔逊相关系数similarity_matrix[u1][u2] = np.corrcoef(vec1, vec2)[0][1] # vec1和vec2的相关性print(similarity_matrix)

运行结果:

3、计算与用户1最为相似的n个用户

target_user = 'user1'
num = 2# 由于最相似的用户为自己,去除本身
sim_users = similarity_matrix[target_user].sort_values(ascending=False)[1:num+1].index.tolist()
print(f'与用户{target_user}最相似的{num}个用户为:{sim_users}')

运行结果:

4、预测用户1对物品5的评分

weighted_scores = 0.
corr_values_sum = 0.target_item = '5'
# 基于皮尔逊相关系数预测用户评分
for user in sim_users:corr_value = similarity_matrix[target_user][user] # 目标与当前user的相关系数user_mean_rating = np.mean(list(user_data[user].values())) # 当前user的评分平均值weighted_scores += corr_value * (user_data[user][target_item] - user_mean_rating) # 权重*(评分-平均),累加corr_values_sum += corr_value # 相关系数之和,分母target_user_mean_rating = np.mean(list(user_data[target_user].values())) # 目标的评分平均值
target_item_pred = target_user_mean_rating + weighted_scores / corr_values_sum # 最后结果
print(f'{target_user}对物品{target_item}的预测评分为:{target_item_pred}')

运行结果:

4.2 ItemCF

1、先建立数据表

def loadData():items = {'1': {'user1': 5.0, 'user2': 3.0, 'user3': 4.0, 'user4': 3.0, 'user5': 1.0},'2': {'user1': 3.0, 'user2': 1.0, 'user3': 3.0, 'user4': 3.0, 'user5': 5.0},'3': {'user1': 4.0, 'user2': 2.0, 'user3': 4.0, 'user4': 1.0, 'user5': 5.0},'4': {'user1': 4.0, 'user2': 3.0, 'user3': 3.0, 'user4': 5.0, 'user5': 2.0},'5': {'user2': 3.0, 'user3': 5.0, 'user4': 4.0, 'user5': 1.0}}return items

2、计算物品相似性矩阵

item_data = loadData()similarity_matrix = pd.DataFrame(np.identity(len(item_data)),index=item_data.keys(),columns=item_data.keys(),
)# 遍历每条物品-用户评分数据
for i1, users1 in item_data.items():for i2, users2 in item_data.items():if i1 == i2:continuevec1, vec2 = [], []for user, rating1 in users1.items():rating2 = users2.get(user, -1)if rating2 == -1:continuevec1.append(rating1)vec2.append(rating2)similarity_matrix[i1][i2] = np.corrcoef(vec1, vec2)[0][1]print(similarity_matrix)

运行结果:

3、计算与物品5最为相似的n个用户

target_user = 'user1'
target_item = '5'
num = 2sim_items = []
sim_items_list = similarity_matrix[target_item].sort_values(ascending=False).index.tolist()
for item in sim_items_list:# 如果target_user对物品item评分过if target_user in item_data[item]:sim_items.append(item)if len(sim_items) == num:break
print(f'与物品{target_item}最相似的{num}个物品为:{sim_items}')

运行结果:

4、 预测用户1对物品5的评分

target_user_mean_rating = np.mean(list(item_data[target_item].values()))
weighted_scores = 0.
corr_values_sum = 0.target_item = '5'
for item in sim_items:corr_value = similarity_matrix[target_item][item]user_mean_rating = np.mean(list(item_data[item].values()))weighted_scores += corr_value * (item_data[item][target_user] - user_mean_rating)corr_values_sum += corr_valuetarget_item_pred = target_user_mean_rating + weighted_scores / corr_values_sum
print(f'用户{target_user}对物品{target_item}的预测评分为:{target_item_pred}')

运行结果:

五、 协同过滤算法的问题分析

目前,协同过滤技术得到了广泛应用。但是随着网站商品信息量和用户人数的不断攀升,网站的结构也越来越复杂。通过对协同过滤技术以及推荐系统的研究,我们发现协同过滤技术的实现中存在的问题主要有以下几点。

5.1 稀疏性问题

稀疏性问题是推荐系统面临的主要问题。比如在一些大型电子商务购买系统,用户购买过的数量相对网站中商品数量可谓是冰山一角,这就导致了用户评分矩阵的数据非常稀疏,进行相似性计算耗费会很大,也难以找到相邻用户数据集,从而使得推荐系统的推荐质量急剧下降。

5.2 冷启动问题

因为传统的协同过滤推荐是基于用户/物品的相似性计算来得到目标用户的推荐,在一个新的项目首次出现的时候,因为没有用户对它作过评价,因此单纯的协同过滤无法对其进行预测评分和推荐。而且,由于新项目出现早期,用户评价较少,推荐的准确性也比较差。

5.3 可扩展性问题

面对日益增多的数据量,算法的扩展性问题成为制约推荐系统实施的重要因素。识别“最近邻居”算法的计算量随着用户和项的增加而大大增加,对于上百万的数目,通常的算法会遇到严重的扩展性瓶颈问题。

经典推荐算法之协同过滤相关推荐

  1. 推荐算法-基于协同过滤的推荐算法

    推荐算法-基于协同过滤的推荐算法 在如今信息量呈爆炸式增长的时代,谷歌百度等搜索引擎为人们查找信息提供了便利,帮助用户快速查找有价值的信息.然而此类查询方式是大众化的,无法根据个人兴趣为用户展示相关的 ...

  2. 推荐算法——基于协同过滤CF

    https://www.toutiao.com/a6643326861214482957/ 2019-01-06 18:21:09 前边我们已经介绍了推荐算法里的基于内容的推荐算法CB,今天我们来介绍 ...

  3. 推荐算法---FM,协同过滤

    文章目录 目录 1.FM算法产生背景 2.FM算法模型 3.FM算法VS其他算法 4.推荐算法总结 目录 1.FM算法产生背景 在传统的线性模型如LR中,每个特征都是独立的,如果需要考虑特征与特征直接 ...

  4. 【推荐算法】协同过滤算法——基于用户 Java实现

    只是简单谢了一个Demo,先贴上GitHub地址. https://github.com/wang135139/recommend-system 基本概念就不过多介绍了,相信能看明白的都了解.如果想了 ...

  5. 初谈推荐算法:协同过滤推荐(CF)算法

    本章主要讲解协同过滤推荐(CF)算法的基础 协同过滤简单来说就是利用某兴趣相投,拥有共同经验之群体的喜好来推荐用户感兴趣的信息.个人通过合作机制基于信息相当程度的回应(如评分)并记录下来以达到过滤的母 ...

  6. 个性化试题推荐系统 协同过滤推荐算法在在线考试系统中的运用 基于用户/项目的协同过滤推荐算法 混合协同过滤推荐算法 协同过滤混合推荐算法

    个性化试题推荐系统 协同过滤推荐算法在在线考试系统中的运用 一.项目开发技术及功能介绍 1.SSH开发框架(spring+struts+hibernate) 2.js.jquery.bootstrap ...

  7. 推荐算法概述:基于内容的推荐算法、协同过滤推荐算法和基于知识的推荐算法

    "无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程." 所谓推 ...

  8. 推荐算法之协同过滤和基于内容推荐

    一.协同过滤 基于用户商品评分矩阵来做协同,典型的是根据余弦相似来求向量相似. 协同过滤典型的有两种Usercf和Itemcf,Usercf的思路就是根据a,b用户相似,将b用户喜欢的a用户未浏览过的 ...

  9. 抖音快手小视频推荐算法之--协同过滤算法剖析

    有人说抖音摧毁了中国的年轻人,也有人说抖音改变了自己的生活形态,还有人说抖音让自己的生活过的更加有意义--一千个人眼中,有一千个哈姆雷特,各人有各个行使自己话语的权力,我们无从争辩. 对于做自媒体的同 ...

最新文章

  1. 计算理论2--可计算理论
  2. java SpringMVC mybatis 多数据源 代码生成器 SSM java redis shiro ehcache
  3. Spark内存管理(2)—— 统一内存管理
  4. 牛客网笔记之数组(一)
  5. url过滤怎么解除_腾讯面试官是这样来问布隆过滤器的?
  6. Redis 哨兵(sentinel)模式集群配置(5.0.3版本)
  7. 1042. Shuffling Machine
  8. selenium+python环境搭建
  9. html mysql查询_mysql查询
  10. 音视频开发入门基础及视频会议即时通讯开源技术选择
  11. 云编程那些事1 - 把开发过程彻底云化
  12. NIOS II --- UART
  13. 腾达和小云无线路由中继(WISP)解决
  14. 介绍一下 ForkJoinPool
  15. 在Excel中查找/替换时使用换行符
  16. ASM磁盘空间假装耗尽,ORA-15041: diskgroup space exhausted
  17. python算法—1234能组成不重复3位数
  18. 嵌入式linux之Uboot和系统移植--基础
  19. Newman运行集合排错
  20. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook详解

热门文章

  1. oracle ob12创建用户,Oracle 11g用户创建、授权和导入dmp文件
  2. 如何使用JavaScript实现纯前端读取和导出excel文件
  3. 12月最新仿知音漫画网站源码+手机端,小说漫画生成静态文件,超强负载量安全可靠
  4. 神经网络机器翻译简单模型参考实现
  5. System Extract 步骤
  6. PS磨皮滤镜插件:Portraiture 3 for Mac破解版永久激活方法
  7. Mini-KMS_Activator激活office2010使用教程
  8. Python学习笔记(十一)——第三十讲
  9. php 字符串 大小,字符串如何比较大小?
  10. DSP的程序加载与运行方式