文章目录

  • UserCF:基于用户的协同过滤
    • 什么是CF
    • 用户相似度计算
    • 最终结果的排序
  • ItemCF:基于物品的协同过滤
  • UserCF和ItemCF的适用场景
  • CF存在的几个缺点
  • 代码实践
    • 数据集
    • Python代码

协同过滤,Collaborative Filtering,CF,可以说是业界影响力最大、应用最广泛的模型,作为曾经推荐系统的首选模型,协同过滤基于系统中其他用户的评分或行为进行预测和推荐,分为基于用户的协同过滤和基于物品的协同过滤两种算法。

UserCF:基于用户的协同过滤

什么是CF

顾名思义,“协同过滤”就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程。

这里用一个商品推荐的例子说明一下

此推荐过程大致可以分为6步:

1、一共有4件商品:电视、杂志、书、游戏机

2、历史上,用户A,B,C,D,XA,B,C,D,XA,B,C,D,X已经对商品有过一些访问的记录,并且留下了好评和差评的标记(对应绿色和红色)。现在需要利用用户XXX对商品的历史评价、其他用户对商品的历史评价,预测是否把电视机推荐给用户XXX

3、为便于计算,将用户和商品放到矩阵里(称为“共现矩阵”),并将好评设为1,差评设为-1,未评价设为0(如果有具体评分,如1-5星,可以将评分作为矩阵的元素值)

4、现在对于是否推荐电视机的问题转换为图中?的数值是多少。既然是协同过滤,所以应当考虑与用户XXX兴趣最相似的nnn个用户,然后综合这nnn个用户对电视机的评价,得到对于XXX和电视机交互的预测。(Top nnn用户问题,nnn是一个超参数)

5、假设选定n=2n=2n=2,可以看出,用户BBB和用户CCC与XXX最相似,所以被选为Top 2用户

6、因为用户BBB和用户CCC对电视机都是负面评价,所以预测XXX对于电视机的评价也是负面,所以不会向用户XXX推荐电视机

以上是简化的利用CF推荐的流程,其中的“用户相似”和“最终结果排序”的计算是不严谨的,这两部分如何计算将会直接影响推荐的结果。

用户相似度计算

两个用户的相似度,也就是在共现矩阵里,计算两个用户对应向量的相似度,常用方法有以下几种:

1、余弦相似度
sim⁡(i,j)=cos⁡(i,j)=i⋅j∥i∥⋅∥j∥\operatorname{sim}(i, j)=\cos (i, j)=\frac{\boldsymbol{i} \cdot \boldsymbol{j}}{\|\boldsymbol{i}\| \cdot\|\boldsymbol{j}\|} sim(i,j)=cos(i,j)=∥i∥⋅∥j∥i⋅j​
用户iii和jjj的向量夹角越小,余弦相似度越大,两个用户越相似

2、皮尔逊相关系数
sim⁡(i,j)=∑pϵP(Ri,p−Rˉi)(Rj,p−Rˉj)∑pϵP(Ri,p−Rˉi)2∑pϵP(Rj,p−Rˉj)2\operatorname{sim}(i, j)=\frac{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{i}, \mathrm{p}}-\bar{R}_{\mathrm{i}}\right)\left(R_{\mathrm{j}, \mathrm{p}}-\bar{R}_{\mathrm{j}}\right)}{\sqrt{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{i}, \mathrm{p}}-\bar{R}_{\mathrm{i}}\right)^{2}} \sqrt{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{j}, \mathrm{p}}-\bar{R}_{\mathrm{j}}\right)^{2}}} sim(i,j)=∑pϵP​(Ri,p​−Rˉi​)2​∑pϵP​(Rj,p​−Rˉj​)2​∑pϵP​(Ri,p​−Rˉi​)(Rj,p​−Rˉj​)​
其中,PPP代表所有item的集合, Ri,pR_{i,p}Ri,p​代表用户iii对物品ppp的评分,Rˉi\bar{R}_{\mathrm{i}}Rˉi​代表用户iii对所有物品的平均评分。

可以看出,加入了用户的平均分,减少了用户评分偏置的影响。

3、基于皮尔逊相关系数,将用户平均分Rˉi\bar{R}_{\mathrm{i}}Rˉi​改成物品平均分Rˉp\bar{R}_{\mathrm{p}}Rˉp​,减少物品评分偏置的影响
sim⁡(i,j)=∑pϵP(Ri,p−Rp‾)(Rj,p−Rp‾)∑pϵP(Ri,p−Rp‾)2∑pϵP(Rj,p−Rp‾)2\operatorname{sim}(i, j)=\frac{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{i}, \mathrm{p}}-\overline{R_{\mathrm{p}}}\right)\left(R_{\mathrm{j}, \mathrm{p}}-\overline{R_{\mathrm{p}}}\right)}{\sqrt{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{i}, \mathrm{p}}-\overline{R_{\mathrm{p}}}\right)^{2}} \sqrt{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{j}, \mathrm{p}}-\overline{R_{\mathrm{p}}}\right)^{2}}} sim(i,j)=∑pϵP​(Ri,p​−Rp​​)2​∑pϵP​(Rj,p​−Rp​​)2​∑pϵP​(Ri,p​−Rp​​)(Rj,p​−Rp​​)​
理论上,任何合理的“向量相似度定义方式”都可以作为相似用户计算的标准。研究人员通过对相似度定义的改进来不断解决传统的CF存在的一些缺陷的。

最终结果的排序

在获得Top n相似用户之后,最常用的是利用用户相似度和相似用户的评价的加权平均获得最终的预测
Ru,p=∑sϵS(wu,s⋅Rs,p)∑sϵSwu,s(4)R_{\mathrm{u}, \mathrm{p}}=\frac{\sum_{\mathrm{s} \epsilon S}\left(w_{\mathrm{u}, \mathrm{s}} \cdot R_{\mathrm{s}, \mathrm{p}}\right)}{\sum_{\mathrm{s} \epsilon S} w_{\mathrm{u}, \mathrm{s}}} \tag{4} Ru,p​=∑sϵS​wu,s​∑sϵS​(wu,s​⋅Rs,p​)​(4)
其中,wu,sw_{u,s}wu,s​是用户uuu和sss的相似度,Rs,pR_{s,p}Rs,p​是用户sss对用户ppp的评分。

(4)式一次可以预测用户UUU对物品p的评分,在预测完所有物品之后,根据评分进行排序,即可得到推荐的列表。

基于用户相似度的推荐,有一个大的前提,认为“兴趣相似的朋友喜欢的物品,我也喜欢”,但从技术的角度,它也存在一些缺点:

  • 在互联网应用的场景下,用户数往往远大于物品数,用户相似度矩阵的存储开销非常大,并且是以n2n^2n2的复杂度快速增长的。
  • 用户的历史数据往往非常稀疏,对于只有几次购买或者点击行为的用户来说,找到相似用户的准确度是非常低的,这导致 UserCF 不适用于那些正反馈获取较困难的应用场景(如酒店预定、大件商品购买等低频应用)

ItemCF:基于物品的协同过滤

为避免上面提到的两个问题,常常采用ItemCF算法实现推荐系统。思想和UserCF很相似,简单来说就是如果用户A同时购买了商品1和商品2,那么说明商品1和商品2的相关度较高。当用户B也购买了商品1时,可以推断他也有购买商品2的需求。

预测对用户XXX推荐Top k\text { Top } k Top k物品

1、基于历史数据,构建用户和物品的m×nm\times nm×n维共现矩阵

2、计算每个物品向量之间的相似度,构建n×nn\times nn×n维的物品相似度矩阵

3、获得用户XXX历史行为数据中的正反馈物品列表

4、利用物品相似度矩阵,针对正反馈物品列表,找出相似的Top k\text { Top } k Top k 物品

5、对Top k\text { Top } k Top k 物品,利用相似度的分值进行排序,生成最终的推荐列表

对第4、5步骤举个例子,用户已经购买过商品4、5,预测推荐商品A,B,C中的哪一个。利用物品相似度矩阵,(可以利用商品4、5的评分进行加权排序),得到最终相似度评分(最下面一行)。

​ 在第5步中,如果一个物品和多个的正反馈物品相似,那么该物品最终相似度应该是多个相似度的累加:
Ru,p=∑hϵH(wp,h⋅Ru,h)R_{\mathrm{u}, \mathrm{p}}=\sum_{\mathrm{h} \epsilon H}\left(w_{\mathrm{p}, \mathrm{h}} \cdot R_{\mathrm{u}, \mathrm{h}}\right) Ru,p​=hϵH∑​(wp,h​⋅Ru,h​)
其中,HHH是目标用户的正反馈物品集合。

UserCF和ItemCF的适用场景

UsercF 的最大特点是即使某个兴趣点以前不在自己的兴趣范围内,也有可能通过朋友的动态快速更新自己的推荐列表。这样的特点使其非常适用于新闻推荐场景。相比用户对不同新闻的兴趣偏好,新闻的及时性、热点性往往是其更重要的属性,而 UsercF 正适用于发现热点,以及跟踪热点的趋势。除此之外,在社交网络中 UserCF 也是一个更好的选择,可以增加用户对推荐解释的信服程度。

​ ItemCF 适用于购物网站、视频推荐等场景。原因之一是兴趣变化较为稳定,用户在一个时间段内更倾向于寻找一类商品,这时利用物品相似度为其推荐相关物品更合适;另一个原因是用户的数量远远超过物品的数量,其物品的数据相对稳定,因此计算物品的相似度时不但计算量较小,而且不必频繁更新。

CF存在的几个缺点

(1)系统开始时推荐质量较差

(2)质量取决于历史数据集

(3)数据稀疏性问题(Sparsity)

(4)系统延伸性问题(Scalability)

(5)用户提供恶意评价对系统带来的偏差

代码实践

数据集

使用ml-100k电影评分数据集中的u.data

四列分别对应用户id,电影id,评分, 时间戳

总共包含943位用户,1682部电影,100000个评分,评分1—5,每个用户至少20部

Python代码

导入处理数据集

import numpy as np
import pandas as pd# 读取u.data文件
header = ['user_id', 'item_id', 'rating', 'timestamp']
df = pd.read_csv('./ml-100k/ml-100k/u.data', sep='\t', names=header)

分割训练集、测试集

from sklearn.model_selection import train_test_split
train_data, test_data = train_test_split(df, test_size=0.2)

创建uesr-item矩阵

# 计算唯一用户和电影的数量(去掉重复)
n_users = df.user_id.unique().shape[0]
n_items = df.item_id.unique().shape[0]
print('Number of users = ' + str(n_users) + ' | Number of movies = ' + str(n_items))# 创建n_users × n_items维矩阵
train_data_matrix = np.zeros((n_users, n_items))
for line in train_data.itertuples():train_data_matrix[line[1] - 1, line[2] - 1] = line[3]
test_data_matrix = np.zeros((n_users, n_items))
for line in test_data.itertuples():test_data_matrix[line[1] - 1, line[2] - 1] = line[3]

通过 pairwise_distances求相似度(余弦相似度)

# 计算相似度
# 使用sklearn的pairwise_distances函数来计算余弦相似性
from sklearn.metrics.pairwise import pairwise_distances
# 计算用户相似度
user_similarity = pairwise_distances(train_data_matrix, metric='cosine')
# 计算物品相似度
item_similarity = pairwise_distances(train_data_matrix.T, metric='cosine')

用户相似度矩阵:

商品相似度矩阵:

预测(基于用户和商品)

# ------------------------预测--------------------------------
def predict(ratings, similarity, type='user'):# 基于用户相似度矩阵的if type == 'user':# 求每一行(user)的平均值mean_user_rating = ratings.mean(axis=1)ratings_diff = (ratings - mean_user_rating[:, np.newaxis]) # np.newaxis自动补充维度pred = mean_user_rating[:, np.newaxis] + similarity.dot(ratings_diff) / np.array([np.abs(similarity).sum(axis=1)]).T# 基于物品相似度矩阵elif type == 'item':pred = ratings.dot(similarity) / np.array([np.abs(similarity).sum(axis=1)])return pred# 预测结果
user_prediction = predict(train_data_matrix, user_similarity, type='user')
item_prediction = predict(train_data_matrix, item_similarity, type='item')

mean_user_rating:user向量的平均值

ratings_diff:U-I矩阵减去每个user的平均值

pred:预测结果

评价结果

协同过滤 - 简书

王喆《深度学习推荐系统》
协同过滤算法原理分析

传统推荐模型——协同过滤相关推荐

  1. 传统推荐模型(一)协同过滤算法_UserCF和ItemCF

    传统推荐模型(一)协同过滤算法_UserCF 1.UserCF 协同过滤就是协同大家的反馈.评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程. 物品1 物品2 物品3 ...

  2. 协同过滤推荐之基于模型协同过滤

    目录 (1)基于模型协同过滤的核心思想 (2)矩阵分解详解 (3)矩阵分解图例及数据演化过程 (4)SVD算法之交替最小二乘(ALS)详解 (5)基于SVD算法之交替最小二乘(ALS)完成推荐开发 几 ...

  3. 经典推荐算法-协同过滤

    协同过滤算法 1.传统推荐模型的演化关系图 2. 协同过滤 2.1 什么是协同过滤 2.2 计算用户相似度 2.3 最终结果排序 2.4 存在缺点 2.5 ItemCF 2.6 各自的应用场景 1.传 ...

  4. 计算机系统应用的书,基于个性化图书推荐的协同过滤算法

    摘 要本文对基于个性化图书推荐的协同过滤算法的设计方案进行实验,目的是为证实在真实用户的多标准评估过程中怎样产生数据集,从而找到一种科学的算法.并通过图书推荐的应用案例来说明算法,以验证其是否有效. ...

  5. 92 推荐算法——相似性推荐和协同过滤

    1 基于相似性的推荐流程 用户偏好如何收集 用户偏好如何整合 大多数情况我们提取的用户行为都多于一种,如何组合这些不同的用户行为,基本上有以下两种方式: 不同的行为分组 一般可以分为"查看& ...

  6. 基于神经网络的推荐算法,协同过滤推荐算法python

    大数据运维的主要工作内容是什么? . 大数据相关工作岗位很多,有大数据分析师.大数据挖掘算法工程师.大数据研发工程师.数据产品经理.大数据可视化工程师.大数据爬虫工程师.大数据运营专员.大数据架构师. ...

  7. Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智能开发 FoodRecom ...

  8. Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 机器学习.分布式大数据.人工智能开发 ShopRec ...

  9. KTV歌曲推荐-深入浅出协同过滤

    前言 推荐算法有很多,最基础的就是协同过滤,前段时间对KTV数据比较感兴趣,大家去唱歌也只是唱熟悉的歌,那是不是有办法给大家一些建议拓展一下唱歌的宽度呢.KTV推荐可能要考虑很多因素,比如唱歌者的音域 ...

  10. 个性化推荐系统原理介绍(基于内容推荐/协同过滤/关联规则/序列模式/基于社交推荐)...

    个性化推荐根据用户兴趣和行为特点,向用户推荐所需的信息或商品,帮助用户在海量信息中快速发现真正所需的商品,提高用户黏性,促进信息点击和商品销售.推荐系统是基于海量数据挖掘分析的商业智能平台,推荐主要基 ...

最新文章

  1. FrostSullivan:2012年中国数据库安全审计与防护产品市场分析
  2. 程序员编程如何入门、进阶?
  3. java中String,int,Integer,char、double类型转换
  4. Ubuntu里的vi编辑器不好用的解决办法
  5. 关于png、背景透明疑难杂症综合帖
  6. 不要重复发明轮子:C++重用的5重境界
  7. B端产品经理思考-软硬产品设计
  8. mysql 浮点数定义2_MySQL学习笔记(二):数据类型
  9. iOS开发——多线程篇——GCD
  10. zabbix入门之添加监控项
  11. php中页面平滑回到顶部代码,原生JS实现平滑回到顶部组件
  12. 【java】java 随机数 Random ThreadLocalRandom SecureRandom
  13. Struts--result详解
  14. python的智能算法_基于pythonQT及智能算法的快速规则定制方法与流程
  15. php模拟表单提交,php用fsockopen()函数实现模拟提交表单。
  16. 经典中的经典算法:动态规划(详细解释,从入门到实践,逐步讲解)
  17. WinForms时代结束,报表控件FastReport.NET开启FastReport.Core.Skia 时代!
  18. Excel如何简单快速的建立二级下拉菜单?
  19. 离京前记--带宝贝爬长城小感想
  20. GoogleHacking 语法篇

热门文章

  1. 编程心得分享,送给刚入门学编程的小伙伴
  2. 看到“东大研究生”吐槽华为cpu,海思,请知道的人科普一下吧,我抛砖引玉
  3. chcp 437>nul graftabl 936>nul
  4. 人艰不拆~找实习之路(二)。
  5. 更改C盘用户目录下的文件夹名称
  6. 菜鸟日志:ADL(C++参数依赖查找)、
  7. 张孝祥正在整理Java就业面试题大全
  8. vue 中的const {XXX } =this 的作用效果
  9. git send-email 使用126邮件发送patch
  10. 撰写 SCI 论文时,有什么好用的软件或者技巧吗?