添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
潇洒的书签  ·  lua ...·  5 月前    · 
慷慨的柿子  ·  WPF ListBox ...·  1 年前    · 
项亮. 推荐系统实践[M]. 北京:人民邮电出版社, 2012.

转载请注明出处: http://blog.csdn.net/xuelabizp/article/details/51823458

0.一些碎碎念

从4月中旬开始,被导师赶到北京的郊区搬砖去了,根本就没有时间学习看书,这个时候才知道之前的生活是多么的幸福:每天看自己想看的书,然后实践一下,最后写博文总结一下,偶尔还能去跑个步,游个泳。想找实习的计划也泡汤了,这个项目最早要到七月中下旬才能结束,只能自己挤时间学习了。

逝者如斯夫,不舍昼夜。

1.基于物品的协同过滤算法简介

如今网上信息泛滥,想要在里面找一条适合自己的信息的成本真的有点高,所以就有了 推荐系统 。于用户而言,推荐系统能够节省自己的时间;于商家而言,推荐系统能够更好的卖出自己的商品。

基于邻域的推荐算法是推荐系统中最基本的算法,该算法分为两大类:基于用户的协同过滤算法(UserCF)和基于物品的协同过滤算法(ItemCF)。

基于用户的协同过滤算法就是找到和“目标用户”相似的用户,然后把他喜欢的东西推荐给“目标用户”。例如小王和小赵一对好基友,他俩喜欢看的书风格基本相同。如果有一天,系统发现小赵给自己的书架添加了一本新书,并且评价很高,那么系统就把这本书自动推荐给了小王,因为小王喜欢这本书的概率很大。设 N ( u ) N(u) 表示用户 u u 喜欢的物品, N ( v ) N(v) 表示用户 v v 喜欢的物品,则两个用户的相似度为:
(1) w = N ( u ) N ( v ) N ( u ) N ( v ) w=\frac {\mid N(u)\bigcap N(v)\mid}{\mid N(u)\bigcup N(v)\mid} \tag 1

相比于基于用户的协同过滤算法,基于物品的协同过滤算法在工业界应用更多,因为基于用户的协同过滤算法主要有两个缺点:

  • 随着网站的用户数目越来越大,计算用户数的相似度将会越来越困难,其运算的时间复杂度和空间复杂度基本和用户的增长数成平方关系
  • 基于用户的协同过滤算法很难对推荐结果做出解释
  • 基于物品的协同过滤算法就是找到和“目标用户”喜欢的物品相似的物品,然后把相似的物品推荐给“目标用户”。例如我很喜欢《黑客帝国》,而《盗梦空间》和《黑客帝国》相似度很高,推荐系统就可以给我推荐《盗梦空间》,实际上我也很喜欢《盗梦空间》。

    2.基于物品的协同过滤算法实现

    基于物品的协同过滤算法主要有两步:

  • 计算物品之间的相似度
  • 根据物品的相似度和用户的历史行为给用户生成推荐列表
  • 2.1计算物品的相似度

    N ( i ) |N(i)| 表示喜欢物品 i i 的用户数, N ( i ) N ( j ) |N(i) \bigcap N(j)|

    (2)式有一个问题,当物品 j j 是一个很热门的商品时,人人都喜欢,那么 w i j w_{ij}

    2.1.1建立用户物品倒排表

    ItemCF首先需要建立用户物品倒排表。设用大写字母表示用户,小写字母表示物品,则建立的用户物品倒排表为:
    一般情况下,数据都是用户物品倒排表,只需要从原始数据中提炼出来即可,此处就不做代码实现了,因为不同系统的数据不一样(不过可以参考后面应用部分建立用户物品倒排表的代码)。

    2.1.2计算共现矩阵C

    共现矩阵C表示同时喜欢两个物品的用户数,是根据用户物品倒排表计算出来的。如根据上面的用户物品倒排表可以计算出如下的共现矩阵C:
    共现矩阵的对角线元素全为0,且是 实对称稀疏矩阵
    实现代码如下:

    from collections import defaultdict #可以直接使用下标访问二维字典不存在的元素
    def cal_corated_users(train):
        C = defaultdict(defaultdict) #用户与用户共同喜欢物品的个数
        N = defaultdict(defaultdict) #用户个数
        for u, items in train.items():
            for i in items:
                if i not in self.N.keys(): #如果一维字典中没有该键,初始化值为0
                    N[i] = 0
                N[i] += 1
                for j in items:
                    if i == j:
                       continue
                    if j not in self.C[i].keys(): #如果二维字典中没有该键,初始化值为0
                        C[i][j] = 0
                    C[i][j] += 1
    

    2.1.3计算余弦相似度矩阵W

    共现矩阵C其实就是式(3)的分子,矩阵N表示喜欢某物品的用户数,那么余弦相似度矩阵很容易就计算出来了,示例的矩阵N,以及余弦相似度矩阵如下所示:
    a和d之间的相似度最高。
    实现代码如下:

    def cal_matrix_W():
            for i, related_items in C.items():
                for j, cij in related_items.items():
                    W[i][j] = cij / math.sqrt(N[i] * N[j]) #余弦相似度
    

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

    最终推荐的是什么物品,是由预测兴趣度决定的。物品jj预测兴趣度=用户喜欢的物品ii的兴趣度×\times物品ii和物品jj的相似度。

    例如某个用户喜欢物品a,b和c,对其兴趣度分别为1,2,2. 那么物品d和e的预测兴趣度分别为:

  • d:1×0.71+2×0.58+2×0.58=3.031 \times 0.71 +2\times 0.58+2\times 0.58=3.03
  • e:2×0.58+2×0.58=2.322\times 0.58+2\times 0.58=2.32
  • 所以应当向该用户推荐物品d。
    实现代码如下:

    def recommend(train, user_id, W, K):
        rank = dict()
        ru = train[user_id] #用户数据,表示某物品及其兴趣度
        for i, pi in ru.items(): #i表示用户已拥有的物品id,pi表示其兴趣度
            #j表示相似度为前K个物品的id,wj表示物品i和物品j的相似度
            for j, wj in sorted(W[i].items(), key=itemgetter(1), reverse=True)[0:K]
            if j in ru: #如果用户已经有了物品j,则不再推荐
                continue
            rank[j] += pi * wj
        return rank
    

    3.基于物品的协同过滤算法应用

    之前写了两篇博文,实现了豆瓣书籍信息的爬取:

  • 利用爬虫获取豆瓣上可能喜欢的书籍
  • 爬取了豆瓣11W+网页,获取了5W+有效书籍信息
  • 其中爬取的某项信息很关键,即某书籍的推荐书籍,如下图所示:

    假设把《代码大全》看做一个用户,那么这些推荐书籍就可以看做该用户喜欢的物品,在数据库中的形式如下:

    将爬取的数据稍微处理一下,一共得到40558本书籍的相关信息,即40558个用户的信息,那么就可以根据这40558个用户的信息计算余弦相似度矩阵,进行书籍推荐。

    把整个计算过程封装到一个类里面,依次建立用户物品倒排表,计算共现矩阵C,计算余弦相似度矩阵W。由于计算余弦相似度矩阵W较为费时(本例大概需要20分钟),所以计算之后使用pickle.dump()把W矩阵保存在本地,下次程序重启的时候直接使用pickle.load()载入即可,大概需要7s。

    编写itemCF(self, urls)函数生成推荐列表,urls表示用户所有添加到书架中的书籍的url,返回预测兴趣度TOP10书籍的url。

    使用PyQt4编写用户界面,方便搜索,查看,添加,删除和推荐书籍,具体如下:

    《统计学习方法》是一本好书,加入到书架中,看看会推荐什么书籍:
    《机器学习实战》不错,是《统计学习方法》的黄金搭档,添加到书架里面,再看看推荐书籍:
    试一试文学类的书籍,比如《夏洛的网》,看看推荐书籍:

    4.一些讨论

    Q:UserCF和ItemCF分别适用于什么情况?
    A:UserCF根据相似用户推荐,更社会化;ItemCF根据用户本身的历史记录推荐,更加个性化。UserCF较适用于新闻,社区等网站,ItemCF较适用于购物等网站。

    Q:UserCF和ItemCF的余弦相似度矩阵W有什么异同?
    A:UserCF的相似度矩阵表示用户之间的相似度,适用于用户较少物品较多的场合;ItemCF的相似度矩阵表示物品之间的相似度,适用于用户较多物品较少的场合。目前的购物网站中,物品数量远远小于用户数量,所以购物网站大多采用ItemCF。

    Q:如何评价一个推荐系统的优劣?
    A:评价一个推荐系统有3种方法:离线实验,用户调查和在线实验。评测的指标有:用户满意度,预测准确度,覆盖率,多样性,新颖性,惊喜度,信任度,实时性,健壮性和商业目标。

  • 源码在这里,期待你的star
  • 计算物品的相似度是ItemCF的关键
  • 计算物品相似度矩阵W有3个步骤:建立用户物品倒排表,计算共现矩阵C,计算余弦相似度矩阵W
  • 选取前K个相似度的物品进行推荐,其中参数K对推荐系统的准确率,召回率,覆盖率和流行度都有影响
  • 协同过滤算法的推荐质量取决于用户的历史数据集,有可能有偏差
  • ItemCF需要维护物品相似度矩阵W,一般一天更新一次
  • 实际应用中的ItemCF往往会增加对流行物品的惩罚度,因为流行物品和任意物品的相似度都很高,而一个优秀的推荐系统应该能够进行长尾物品推荐
  • 一、基础算法基于物品的协同过滤算法(简称ItemCF)给用户推荐那些和他们之前喜欢的物品相似的物品。不过ItemCF不是利用物品的内容计算物品之间相似度,而是利用用户的行为记录。该算法认为,物品A和物... 来自: ls317842927的博客 文章是基于物品的协同过滤算法itemCF原理及python代码实现,其中的文件包含MovieLens数据集中的ml-100k数据集,开发环境是Python2.7.代码是我按照《推荐系统实践》里面的公式... 来自: Flying_sfeng的博客 “无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。” 目前推荐系统研宄的主要趋... 来自: 飘过的春风 基于物品的协同过滤,ItemCF,ItemCollaborationFilter,核心思想给用户推荐那些和他们之前喜欢的物品相似的物品。比如,用户A之前买过《数据挖掘导论》,该算法会根据此行为给你推荐... 来自: 起因又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满!而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,... 来自: bigsai 概念: 基于物品的协同过滤算法,优化算法对比:用户协同过滤的优缺点python编码实现1,算法定义基于用户的协同过滤算法基于商品的协同过滤算法适用场景时效性较强,用户个性化兴趣不太明显的领域长尾物品丰... 来自: eyeofeagle的博客   上一篇博客我简单讲了一下基于用户的协同过滤算法,这里我们一起来学习一下另一种:基于物品的协同过滤算法。基于物品的协同过滤算法是目前业界应用最多的算法,亚马逊、Netflix、Hulu、YouTub... 来自: 未名湖畔的落叶 前言最近学校的课题就是一个基于物品的协同过滤算法,自己亲手实现了一把,github中自带数据库和各种包,导出即可运行,另有一篇本人当时的课题报告,写的会比本篇详细的多,所以在这里简述一下,感兴趣的朋友... 来自: Suprit's blog 基于物品的协同过滤算法(ItemCF)给用户推荐那些和他们之前喜欢的物品相似的物品。比如:该算法会因为你购买过《数据挖掘导论》而给你推荐《机器学习》。不过ItemCF算法不利用物品的内容属性计算物品之... 来自: m0_37917271的博客 相关理论思想指导,请查看《推荐系统实践》——基于物品的协同过滤算法,本例根据以上理论思想,基于电影背景,使用python实现如下:#-*-coding:utf-8-*-'''''Createdon20... 来自: qq_31337471的博客 ItemCF:ItemCollaborationFilter,基于物品的协同过滤算法核心思想:给用户推荐那些和他们之前喜欢的物品相似的物品。比如,用户A之前买过《数据挖掘导论》,该算法会根据此行为给你... 来自: 在路上的学习者 1.定义  基于物品的协同过滤(item-based collaborative filtering)算法是目前业界应用最多的算法。ItemCF给用户推荐那些和他们之前喜欢的物品相似的物品,用户A 喜... 来自: jiangdongxiaobawang的博客 https://github.com/litaotao/guidetodatamining/blob/master/chapter-3.md定义而基于物品的协同过滤则是找出最相似的物品,再结合用户的评... 来自: abcd1101的专栏 基于用户基本思路:当用户A需要个性化推荐的时候,可以先找到和他兴趣相似的用户群体G,然后把G所喜欢的且A没有听说过或没有见过的推荐给用户A。方法:1、找到与用户A兴趣相似的用户群体2、G所喜欢的且A没... 来自: 厄尔尼诺的博客 通过计算不同用户对于不同物品的评分,获得物品间的关系。基于物品间的关系对用户进行相似物品的推荐。举例说明,每一个行向量表示某个物品被各个用户的评分,先中心化如何预测用户 E 对 哈利波特的喜好程度?计... 来自: lm324114的专栏  在协同过滤中,有两种主流方法:基于用户的协同过滤,和基于物品的协同过滤。具体怎么来阐述他们的原理呢,看个图大家就明白了基于用户的 CF 的基本思想相当简单,基于用户对物品的偏好找到相邻邻居用户,然后... 来自: OYY_90的博客 一、背景介绍 互联网的迅猛发展将人类带入了信息社会和网络经济时代,信息化影响到了生活的方方面面。但是随着互联网产业的扩大,为用户提供更多选的同时也带来了筛选与推荐的难题。于是便提出了推荐算法帮助用户... 来自: wickedvalley 一、源码说明基于物品的协同过滤算法和基于用户的协同过滤算法类似,以给该物品评分的用户作为物品的特征向量,从而计算物品之间的余弦相似度。以下代码根据点击打开链接修改而来,修改了计算相似度的函数和进行推荐... 来自: 好好学习,天天向上 基于物品的协同过滤算法主要分为两步。(1) 计算物品之间的相似度。(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。1 基础算法        我们可以用下面的公式定义物品的相似度:分母|N... 来自: wxn704414736的博客 本文将深入介绍推荐系统的工作原理,和其中涉及的各种推荐机制,以及它们各自的优缺点和适用场景,帮助用户清楚的了解和快速构建适合自己的推荐系统。1 信息发现随着 Web 2.0 的发展, Web 已经变成... 来自: weixin_34018202的博客 一.背景及优点随着网站的用户数目越来越大,计算用户兴趣相似度矩阵越来越困难,其运算时间复杂度和空间时间复杂度的增长和用户数的增长近似于平方关系。其次,基于用户的协同过滤算法很难对推荐结果作出解释。 因... 来自: Gedeon 摘 要在当下这个信息爆炸的时代,各种各样的书籍条目繁多,浩如烟海;相应地,为满足用户需求,电商平台需要推荐系统来帮助用户找到自己可能需要的书籍。本文旨在利用基于物品的协同过滤算法,来实现一个... 来自: ancientear的博客 1:协同过滤算法简介2:协同过滤算法的核心3:协同过滤算法的应用方式4:基于用户的协同过滤算法实现5:基于物品的协同过滤算法实现一:协同过滤算法简介 关于协同过滤的一个最经典的例子就是看电影,有时候... 来自: weixin_33774883的博客 代码如下:#encoding:utf-8fin = open('1.txt', 'r')'''建立正向索引: “文档1”的ID > 单词1:出现位置列表;单词2:出现位置列表;………… ... 来自: 涛涛不绝蕾蕾于冬 本文将用python实现倒排索引如下,一个数据表docu_set中有三篇文章的,d1,d2,d3,如下docu_set={'d1':'i love shanghai', 'd2':'... 来自: luoganttcc的博客 基于用户的协同过滤和皮尔逊相关系数2012 年 11 月 05 日 isnowfy algorithm, webGo to comment推荐系统的经典算法就是协同过滤了,协同过滤算法有两种,一种是基... 来自: pi9nc的专栏          随着大数据的指数倍增长,用户的面对的数据越来越多,用户产生的数据也越来越多。面对如此庞大的数据,怎样能上用户得到符合自己需求的数据。选择越多,用户往往不知道该怎么选,用户更希望你能告... 来自: 只布布倩 推荐系统之基于物品的协同过滤算法(ItemCF)前端时间已经把基于用户的推荐系统给弄出来了,详情见我的另一篇文章:点击打开链接,(建议先看懂UserCF后再来看这篇文章,当然大佬可以忽视)其实理解了基... 来自: 其实我是C先生--的博客 基于物品的协同过滤算法的原理:       基于物品的协同过滤算法给用户推荐那些和他们之前喜欢的物品相似的物品。不过ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为... 来自: 番茄哈哈的博客 目录 协同过滤基于用户的过滤基于项目的过滤基于内容的过滤混合系统检查每种类型的利弊 协同过滤在 2012 年初,爆出了这样一则新闻故事:一位男子进入一家Target商店,挥舞着手中的一叠优惠券,这些都... 来自: 探索世界,改变世界 简书不支持Markdown Math语法,请移步https://glassywing.github.io/2018/04/10/spark-itemcf/简介当前spark支持的协同过滤算法只有ALS... 来自: dl2277130327的博客 最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法。ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通... 来自: weixin_34119545的博客 一、协同过滤(collaborative filtering,CF)1.由于v(信息量)> v(处理过程),所以有限时间里浏览有用商品。也就是使用集体的智慧来推荐相关产品。2.传统的是基于用户的,根据... 来自: 追逐卓越 持续更新。。。。。。2.1斐波那契系列问题2.2矩阵系列问题2.3跳跃系列问题3.1 01背包3.2 完全背包3.3多重背包3.4 一些变形选讲2.1斐波那契系列问题在数学上,斐波纳契数列以如下被以递... 来自: hebtu666 在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次... 来自: 程序员宜春的博客 由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,... 来自: 帅地 最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成)one 樱花树 动态生成樱花效... 来自: 碎片 基于物品的协同过滤算法:理论说明,... weixin_43913039:同学您好我想做一个基于用户评分数据的协同过滤,算法模型已经有了,可需要大量用户的对自己看过的书的评分数据作为基础,来方便新用户在评了几本书之后找相似用户,,可这大量的用户评分数据您觉得该怎么找呢

    机器视觉学习笔记(5)——基于Op... ww13679117707:[reply]qq_41421551[/reply] 请问,你用单目相机主要做的是什么内容?

    条形码识别(1)——基础知识 seasays: