读书笔记:集体智慧编程(1)

概述:

协作性过滤,是一种目前广泛运用于电子商务、交友网站、在线广告等互联网领域的一项技术。其主要作用是为指定用户在广大的用户群中找到品味相同或者相似的人,从而帮助网站针对性的推荐产品给特定的用户,与此同时,用户本人也可以从一堆纷繁复杂的信息中,迅速找到自己喜欢的、感兴趣的那部分信息。

其主要有两种实现方法,一种是基于用户的(user-based),即通过分析用户间的相似性,生成最近的邻居,将邻居中“得分”最高的项目推荐给用户;另一种是基于物品的(item-based),即通过分析用户群体对物品的评价计算出每个物品的“得分”,然后根据用户对某件物品的评价,将与该物品相似度最高的物品推荐给用户,典型的例子是亚马逊的图书推荐。两者在不同的应用中,各有千秋。

一般实现需要三个步骤:

  • 收集用户偏好
  • 找到相似的用户或者物品
  • 计算推荐

收集用户偏好:

收集用户偏好是协作性过滤的基础,数据的来源也可以多种多样。集体智慧编程示例数据是一份电影评价。具体如下:

找到相似的用户或者物品:

相似度计算:计算用户间或者物品间相似度的方法很多,该书中主要介绍了两种方法。

一是欧几里得距离,可以以电影为坐标轴,将评价者按评分在坐标系中一一标出,然后计算两者的距离,距离越近就越相似。

数学公式为:

  

另一种称为皮尔逊相关系数,可以以评价者作为坐标轴将电影在坐标系内标出,计算最佳拟合线。该取值在 [-1,+1] 之间。

 数学公式: 

计算推荐:

如上表格,是给其中一位名为Toby的评论者推荐他没有看过的电影的过程。首先运用欧几里得或者皮尔逊方法得到相似度值(Similarity 列)。然后用相似度值乘以每一位评论者的打分,从而得到一个新的“得分”。最后将得分总和除以相似度值的总和得到每部电影最终的“推荐值”。“推荐值”越高,越可能得到Toby的认可。

代码实现:

  1 # -*- coding: utf-8 -*-
  2
  3 # A dictionary of movie critics and their ratings of a small
  4 # set of movies
  5 critics = {‘Lisa Rose‘: {‘Lady in the Water‘: 2.5, ‘Snakes on a Plane‘: 3.5,
  6                          ‘Just My Luck‘: 3.0, ‘Superman Returns‘: 3.5, ‘You, Me and Dupree‘: 2.5,
  7                          ‘The Night Listener‘: 3.0},
  8            ‘Gene Seymour‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 3.5,
  9                             ‘Just My Luck‘: 1.5, ‘Superman Returns‘: 5.0, ‘The Night Listener‘: 3.0,
 10                             ‘You, Me and Dupree‘: 3.5},
 11            ‘Michael Phillips‘: {‘Lady in the Water‘: 2.5, ‘Snakes on a Plane‘: 3.0,
 12                                 ‘Superman Returns‘: 3.5, ‘The Night Listener‘: 4.0},
 13            ‘Claudia Puig‘: {‘Snakes on a Plane‘: 3.5, ‘Just My Luck‘: 3.0,
 14                             ‘The Night Listener‘: 4.5, ‘Superman Returns‘: 4.0,
 15                             ‘You, Me and Dupree‘: 2.5},
 16            ‘Mick LaSalle‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 4.0,
 17                             ‘Just My Luck‘: 2.0, ‘Superman Returns‘: 3.0, ‘The Night Listener‘: 3.0,
 18                             ‘You, Me and Dupree‘: 2.0},
 19            ‘Jack Matthews‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 4.0,
 20                              ‘The Night Listener‘: 3.0, ‘Superman Returns‘: 5.0, ‘You, Me and Dupree‘: 3.5},
 21            ‘Toby‘: {‘Snakes on a Plane‘: 4.5, ‘You, Me and Dupree‘: 1.0, ‘Superman Returns‘: 4.0}}
 22
 23 from math import sqrt
 24
 25 def sim_distance(prefs, person1, person2):
 26     si = {}
 27     for item in prefs[person1]:
 28         if item in prefs[person2]:
 29             si[item] = 1
 30
 31     if len(si) == 0: return 0
 32     sum_of_squares = sum(
 33         [pow(prefs[person1][item] - prefs[person2][item], 2) for item in prefs[person1] if item in prefs[person2]])
 34     return 1 / (1 + sqrt(sum_of_squares))
 35
 36
 37 def sim_pearson(prefs, person1, person2):
 38     si = {}
 39     for item in prefs[person1]:
 40         if item in prefs[person2]:
 41             si[item] = 1
 42
 43     n = len(si)
 44     if n == 0: return 1
 45
 46     sum1 = sum([prefs[person1][it] for it in si])
 47     sum2 = sum([prefs[person2][it] for it in si])
 48
 49     sum1Sq = sum([pow(prefs[person1][it], 2) for it in si])
 50     sum2Sq = sum([pow(prefs[person2][it], 2) for it in si])
 51
 52     pSum = sum([prefs[person1][it] * prefs[person2][it] for it in si])
 53
 54     num = pSum - (sum1 * sum2 / n)
 55     den = sqrt((sum1Sq - pow(sum1, 2) / n) * (sum2Sq - pow(sum2, 2) / n))
 56     if den == 0: return 0
 57
 58     r = num / den
 59     return r
 60
 61
 62 # Returns the best matches for person from the prefs dictionary.
 63 # Number of results and similarity function are optional params.
 64 def topMatches(prefs, person, n=5, similarity=sim_pearson):
 65     scores = [(similarity(prefs, person, other), other) for other in prefs if other != person]
 66     # Sort the list so the highest scores appear at the top
 67     scores.sort()
 68     scores.reverse()
 69     return scores[0:n]
 70
 71
 72 # Gets recommendations for a person by using a weighted average
 73 # of every other user‘s rankings
 74 def getRecommendations(prefs, person, similarity=sim_pearson):
 75     totals = {}
 76     simSums = {}
 77     for other in prefs:
 78         # don‘t compare me to myself
 79         if other == person: continue
 80         sim = similarity(prefs, person, other)
 81         # ignore scores of zero or lower
 82         if sim <= 0: continue
 83         for item in prefs[other]:
 84             # only score movies I haven‘t seen yet
 85             if item not in prefs[person] or prefs[person][item] == 0:
 86                 # Similarity * Score
 87                 totals.setdefault(item, 0)
 88                 totals[item] += prefs[other][item] * sim
 89                 # Sum of similarities
 90                 simSums.setdefault(item, 0)
 91                 simSums[item] += sim
 92     # Create the normalized list
 93     rankings = [(total / simSums[item], item) for item, total in totals.items()]
 94     # Return the sorted list
 95     rankings.sort()
 96     rankings.reverse()
 97     return rankings
 98
 99 if __name__ == ‘__main__‘:
100     print getRecommendations(critics,‘Toby‘,similarity=sim_pearson)

时间: 2024-10-23 22:39:58

读书笔记:集体智慧编程(1)的相关文章

集体智慧编程——决策树建模(上)

本文主要介绍一种非常流行的分类算法:决策树分类算法. 例子:一个网站上有多少用户会愿意为某些高级会员功能而支付费用. 步骤一:导入数据: 新建一个treepredict.py的问价,将下面数据写入.数据的具体信息分别是:来源网站,位置,是否读过FAQ,浏览网页数,选择服务类型. my_data=[['slashdot','USA','yes',18,'None'], ['google','France','yes',23,'Premium'], ['digg','USA','yes',24,'B

集体智慧编程——决策树建模(下)

一.决策树的显示: 前面我们已经得到了一棵决策树,下一步也许我们该进行数的浏览了.下面这段函数就是一个以纯文本的方式显示决策树的方法,虽然输出不是很美观,但是对于显示节点不是太多的树而言,这也是一种简单的方式. def printtree(tree,indent=''): if tree.results!=None: print str(tree.results) else: print str(tree.col)+':'+str(tree.value)+'?' print indent+'T-

集体智慧编程_第二章(提供推荐)_1

前言:最近正在拜读Toby Segaran先生写的集体智慧编程,首先感谢Toby Segaran先生将知识以书本的方式传播给大家,同时也感谢莫映和王开福先生对此书的翻译,谢谢各位的不辞辛苦.首先在写随笔之前,跟各位分享一下我的编程环境:win7系统,python版本是2.7.10,开发环境我选择的是pycharm程序.本书的第一章为集体智慧导言,主要介绍的何为集体智慧和机器学习的相关概念和其局限性,以及与机器学习相关的例子和应用场景.下面开始机器学习第二章--提供推荐的相关内容. 本章主要内容:

集体智慧编程(一)推荐系统之欧里几德距离

在网上购物,听歌,看电影的网站上,网站都会根据我们的购物记录,听歌记录或着是观看记录给我们推荐一些商品,音乐或者是电影.那这些推荐系统是怎么实现的呢?首先,推荐一个东西,得是购物者所感兴趣的,那么怎么判断购物者对该物品感兴趣呢?那么,就得根据购物者的记录来判断了,假定购物者所购买的物品都是他所感兴趣的.那么跟该购物者的物品相似的物品就是可以推荐的,这种推荐是基于相似条目的.另外,可以相似的人会大都会有相同的爱好,因此可以根据购物者的该买记录找出相似的购物者,并把相似购物者购买的物品推荐出来,这就

集体智慧编程--勘误表(1-4章)

最近在工作之余的时间在阅读集体智慧编程这本书,在随书码字的过程中遇到的一些问题,就在这里记录一下: (注:下面的页码针对于英文的非影印版) chapter1 标题: 没什么说的,浏览下就好. chapter2 提供推荐: 1.书上的源码是基于python 2.x,而在3.x中print是被当作一个函数处理,所以要自己加上括号; 2.在P42利用del.icio.us提供的rss订阅源构建数据集时,这本书发布时间较长的原因,python api pydelicious的 很多接口已经发生了改变,这

读书笔记-----Java并发编程实战(一)线程安全性

线程安全类:在线程安全类中封装了必要的同步机制,客户端无须进一步采取同步措施 示例:一个无状态的Servlet 1 @ThreadSafe 2 public class StatelessFactorizer implements Servlet{ 3 public void service(ServletRequest req,ServletResponse resp){ 4 BigInteger i = extractFromRequest(req); 5 BigInteger[] fact

集体智慧编程中相关章节对应论文数

准备开题报告了,先要熟悉一下领域范围,<集体智慧编程>参考一下论点.简单的思路是看一下哪个话题最热门,用google学术来衡量一下论文数,虽然不够精确但是足以反应一点什么. 当然是选择最近比较热门的,同时参考一下国内的论文数目情况. 关键字 总的 2014 国内总数 2014 推荐 2,480,000 42,600 223,124 2728 协同过滤 194,000 4,350 11,239 112 聚类 2,550,000 54,600 141,003 1598 搜索与排名 2,120,00

《集体智慧编程——导言》 有感

导言部分,截取一些概念.定义的东西如下: 什么是集体智慧 为了创造新的想法,而将一群人的行为.偏好或思想组合在一起: 什么是机器学习 机器学习是人工智能领域中与算法相关的一个子领域,它允许计算机不断的进行学习.大多数情况下,这相当于将一组数据传递给算法,并由算法推断出与这些数据的属性相关的信息——借助这些信息,算法就能够预测出未来有可能会出现的其他数据.这种预测是完全有可能的,因为几乎所有的非随机数据中,都会包含这样活那样的“模式”,这些模式的存在使机器得以据此进行规划.为了实现规划,机器会利用

《集体智慧编程》 读书笔记 第二章

作为个人记录之用,主要是将代码及其注释贴出来. from math import sqrt critics={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5, 'The Night Listener': 3.0}, 'Gene Seymour': {'Lady in th