基于物品的协同过滤算法(item-based collaborative filtering,以下简称ItemCF)算法思想:给用户推荐那些和他们之前喜欢的物品相似的物品。

不过,ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。

基于物品的协同过滤算法可以利用用户的历史行为给推荐结果提供推荐解释,比如给用户推荐《天龙八部》的解释可以是因为用户之前喜欢《射雕英雄传》。

ItemCF算法主要分为两步。 (1) 计算物品之间的相似度。 (2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。

计算物品相似度

可以用下面的公式定义物品的相似度:

这里,分母|N(i)|是喜欢物品i的用户数,而分子

是同时喜欢物品i和物品j的用户数。因此,上述公式可以理解为

喜欢物品i的用户中有多少比例的用户也喜欢物品j

如果物品j很热门,很多人都喜欢, 那么

就会很大,接近1。因此,该公式会造成任何物品都会和热门的物品有很大的相似度。为了避免推荐出热门的物品,可以用下面的公式:

这个公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性。

计算物品相似度时可以首先建立用户—物品倒排表(即对每个用户建立一个包含他喜欢的物品的列表),然后对于每个用户,将他物品列表中的物品两两在共现矩阵C中加1。

import math
from collections import defaultdict
​
def item_similarity(self, trainset):# 物品相似度矩阵item_similarity_matrix = {}# 物品流行度item_popularity = {}
​for user, items in trainset.items():for item1 in items:# 构造物品相似度矩阵,计算物品共现次数item_similarity_matrix.setdefault(item1, defaultdict(int))for item2 in items:if item1 == item2:continueitem_similarity_matrix[item1][item2] += 1
​# 统计喜欢item1的用户数if item1 not in item_popularity:item_popularity[item1] = 0item_popularity[item1] += 1
​# 计算最终的相似度矩阵for item1, releated_items in item_similarity_matrix.items():for item2, count in releated_items.items():self.item_similarity_matrix[item1][item2] = count / math.sqrt(item_popularity[item1] * item_popularity[item2])
return item_similarity_matrix

产生推荐列表

在得到物品之间的相似度后,ItemCF通过如下公式计算用户u对一个物品j的兴趣:

这里N(u)是用户喜欢的物品的集合,S(j,K)是和物品j最相似的K个物品的集合,

是物品j和i的相似度,
是用户u对物品i的兴趣(对于隐反馈数据集,如果用户u对物品i有过行为,即可令
。)该公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。

关于物品相似度的一些改进

  • 用户活跃度对物品相似度的影响

John S. Breese在论文“Empirical Analysis of Predictive Algorithms for Collaborative Filtering ”中提出了一个称为IUF(Inverse User Frequence),即用户活跃度对数的倒数的参数,他认为活跃用户对物品相似度的贡献应该小于不活跃的用户,他提出应该增加IUF参数来修正物品相似度的计算公式:

当然,上面的公式只是对活跃用户做了一种软性的惩罚,但对于很多过于活跃的用户,为了避免相似度矩阵过于稠密,我们在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中。

  • 物品相似度归一化

研究发现,如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率。如果已经得到了物品相似度矩阵w,那么可以用如下公式得到归一化之后的相似度矩阵w':

归一化的好处不仅仅在于增加推荐的准确度,它还可以提高推荐的覆盖率和多样性。

基于物品的协同过滤推荐算法_《推荐系统实践》3.基于物品的协同过滤算法相关推荐

  1. 推荐系统实践(二)----基于物品的协同过滤算法(ItemCF)

      上一篇博客我简单讲了一下基于用户的协同过滤算法,这里我们一起来学习一下另一种:基于物品的协同过滤算法.基于物品的协同过滤算法是目前业界应用最多的算法,亚马逊.Netflix.Hulu.YouTub ...

  2. 推荐系统实践(七)----基于邻域的社会化推荐算法

      今年抖音非常火爆和流行,我们在刷抖音的时候,经常会发现给我们刷到自己微信或者是抖音好友喜欢的小视频,这里很多人都就会很好奇,抖音怎么知道这些人是我的好友,甚至知道我和好友的兴趣就一样呢,这就有了基 ...

  3. 推荐系统实践(一)----基于用户的协同过滤算法(UserCF)

      随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载的时代.在这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:如何从大量信息中找到自己感兴趣的信息是一件非常困难的事情,这 ...

  4. 协同过滤算法_推荐系统(5):协同过滤算法的基本思想

    1 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法.要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道 ...

  5. 推荐系统实践(五)----基于图的推荐算法

      基于图的模型(graph−basedmodelgraph-based modelgraph−basedmodel)是推荐系统中的重要内容.在研究基于图的模型之前,首先需要将用户行为数据表示成图的形 ...

  6. dp聚类算法_【深度】基于残差分析的混合属性数据聚类算法

    CAA 智慧起航,共创未来 聚类分析在医学.图像分割.生物学.电子商务.互联网等领域得到了广泛应用.在实际应用环境中,被聚类的数据通常含有数值属性和分类属性,例如医学检测报告不仅有血压.脉搏等数值属性 ...

  7. 异常行为检测算法_检测异常行为的异常或异常类型算法

    异常行为检测算法 Anomaly detection is a critical problem that has been researched within diverse research ar ...

  8. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  9. 深度学习算法和机器学习算法_啊哈! 4种流行的机器学习算法的片刻

    深度学习算法和机器学习算法 Most people are either in two camps: 大多数人都在两个营地中: I don't understand these machine lea ...

  10. 关联规则挖掘算法_关联规则的挖掘与应用——Apriori和CBA算法

    文|光大科技大数据部  魏乐 卢格润 1  关联规则 1.1 关联规则基本概念 1.2 Apriori算法基本思路 2  关联分类 2.1  CBA关联分类算法思路 2.2  CBA算法实现 总结 关 ...

最新文章

  1. 无监督学习之RBM和AutoEncoder
  2. 【LInux】查看Linux系统版本信息
  3. Python 3.9.1 安装教程
  4. Linux压缩打包命令
  5. 孙叫兽进阶之路之压力与绩效
  6. python调用数据库数据创建函数_Pyhton应用程序数据库函数封装
  7. python socket 发送图片
  8. 使用beanShell来解析执行java的String方法,类似javascipt的eval方法
  9. GOTURN——基于深度学习的物体追踪 (OpenCV contrib)
  10. java汉字拼音首字母的获取解决方案
  11. python读取二进制文件_python中读写二进制文件
  12. k3s部署Tx2集群
  13. hdu 6184 Counting Stars(三元环计数)
  14. 微信小程序学习心得----订咖啡
  15. java 行政区划 三级_Java学习-056-Jsoup爬虫获取中国所有的三级行政区划数据
  16. 【Linux】磁盘类型设备驱动介绍
  17. iphone12android在线啥意思,iOS12要来了,你还不知道这些iPhone的隐藏功能?
  18. 【毕业设计/matlab系列】基于区域生长和形态学处理的道路检测实现【含Matlab源码】
  19. CentOS升级或安装安装JDK 8
  20. 网络训练时出现loss为nan的情况(已解决)

热门文章

  1. Changing scope values asynchronously - updates don't propagate without .apply()
  2. 从bsp redirect到ui5_ui5
  3. SAP Leonardo平台机器学习API的一些错误处理机制
  4. document builder how is document url being generated
  5. 点击Result list里product ID出现白屏的又一原因及分析
  6. Kubernetes pod状态出现CrashLoopBackOff 的原因
  7. 如何在Netweaver SE16里直接查看某数据库行记录 1
  8. 包含重复数字序列的全排列Python解法
  9. linux卸载anaconda_Win10安装Anaconda和Pytorch(CPU版)
  10. php网站后台无法退出,zblog“网站关闭”后进入不了后台的解决方法