Note3 :《集体智慧编程》用户相似度计算

欧几里德距离评价:

以经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察他们彼此之间的距离远近。计算出每一轴向上的差值,求平方之后再相加,最后对总和取平方根。

# -*- coding: UTF-8 -*-

#一个涉及影评者及其对几部影片评分情况的字典
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 the Water‘: 3.0, ‘Snakes on a Plane‘: 3.5,
 ‘Just My Luck‘: 1.5, ‘Superman Returns‘: 5.0, ‘The Night Listener‘: 3.0,
 ‘You, Me and Dupree‘: 3.5},
‘Michael Phillips‘: {‘Lady in the Water‘: 2.5, ‘Snakes on a Plane‘: 3.0,
 ‘Superman Returns‘: 3.5, ‘The Night Listener‘: 4.0},
‘Claudia Puig‘: {‘Snakes on a Plane‘: 3.5, ‘Just My Luck‘: 3.0,
 ‘The Night Listener‘: 4.5, ‘Superman Returns‘: 4.0,
 ‘You, Me and Dupree‘: 2.5},
‘Mick LaSalle‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 4.0,
 ‘Just My Luck‘: 2.0, ‘Superman Returns‘: 3.0, ‘The Night Listener‘: 3.0,
 ‘You, Me and Dupree‘: 2.0},
‘Jack Matthews‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 4.0,
 ‘The Night Listener‘: 3.0, ‘Superman Returns‘: 5.0, ‘You, Me and Dupree‘: 3.5},
‘Toby‘: {‘Snakes on a Plane‘:4.5,‘You, Me and Dupree‘:1.0,‘Superman Returns‘:4.0}}

from math import sqrt

#返回一个有关person1与person2的基于距离的相似度评价
def sim_distance (prefs,person1,person2):
    #得到shared_items的列表
    si={}
    for item in prefs[person1]:
        for item in prefs[person2]:
            si[item]=1

    #如果两者没有共同之处,则返回0
    if len(si)==0: return 0

    #计算所有差值的平方和
    sum_of_squares=sum([ pow(prefs[person1][item]-prefs[person2][item],2)
                         for item in prefs[person1] if item in prefs[person2]])

    return 1/(1+sqrt(sum_of_squares))

print(sim_distance(critics,‘Lisa Rose‘,‘Gene Seymour‘))

皮尔逊相关度评价:

Mick Lasalle为《Superman》评了3分,而Gene Seyour则评了5分,所以该影片被定位中图中的(3,5)处。在图中还可以看到一条直线。

皮尔逊相关系数是判断两组数据与某一直线拟合程度的一种度量。

通常情况下:

相关系数0.8-1.0为极强相关

0.6-0.8为强相关

0.4-0.6为中等程度相关

0.2-0.4为弱相关

0.0-0.2为极弱相关或无相关

最佳拟合线:尽可能地靠近图上的所有坐标点。

修正“夸大分值”情况。

皮尔逊积差系数:

  数学特征:

  

     其中,E数学期望,cov表示协方差

     因为μX = E(X),σX2 = E(X2) − E2(X),同样地,对于Y,可以写成

  

  当两个变量的标准差都不为零,相关系数才有定义。从柯西—施瓦茨不等式可知,相关系数不超过1. 当两个变量的线性关系增强时,相关系数趋于1或-1。当一个变量增加而另一变量也增加时,相关系数大于0。当一个变量的增加而另一变量减少时,相关系数小 于0。当两个变量独立时,相关系数为0.但反之并不成立。 这是因为相关系数仅仅反映了两个变量之间是否线性相关。比如说,X是区间[-1,1]上的一个均匀分布的随机变量。Y = X2. 那么Y是完全由X确定。因此YX是不独立的。但是相关系数为0。或者说他们是不相关的。当YX服从联合正态分布时,其相互独立和不相关是等价的。

  假设有两个变量X、Y,那么两变量间的皮尔逊相关系数可通过以下公式计算:

  公式一:

  公式二:

  公式三:

  公式四:

  以上列出的四个公式等价,其中E是数学期望,cov表示协方差,N表示变量取值的个数。

利用公式一代码:

# -*- coding: UTF-8 -*-

#一个涉及影评者及其对几部影片评分情况的字典
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 the Water‘: 3.0, ‘Snakes on a Plane‘: 3.5,
 ‘Just My Luck‘: 1.5, ‘Superman Returns‘: 5.0, ‘The Night Listener‘: 3.0,
 ‘You, Me and Dupree‘: 3.5},
‘Michael Phillips‘: {‘Lady in the Water‘: 2.5, ‘Snakes on a Plane‘: 3.0,
 ‘Superman Returns‘: 3.5, ‘The Night Listener‘: 4.0},
‘Claudia Puig‘: {‘Snakes on a Plane‘: 3.5, ‘Just My Luck‘: 3.0,
 ‘The Night Listener‘: 4.5, ‘Superman Returns‘: 4.0,
 ‘You, Me and Dupree‘: 2.5},
‘Mick LaSalle‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 4.0,
 ‘Just My Luck‘: 2.0, ‘Superman Returns‘: 3.0, ‘The Night Listener‘: 3.0,
 ‘You, Me and Dupree‘: 2.0},
‘Jack Matthews‘: {‘Lady in the Water‘: 3.0, ‘Snakes on a Plane‘: 4.0,
 ‘The Night Listener‘: 3.0, ‘Superman Returns‘: 5.0, ‘You, Me and Dupree‘: 3.5},
‘Toby‘: {‘Snakes on a Plane‘:4.5,‘You, Me and Dupree‘:1.0,‘Superman Returns‘:4.0}}

from math import sqrt

#返回p1和p2的皮尔逊相关系数
def sim_pearson(prefs,p1,p2):
    #得到双方都曾评价过的物品列表
    si={}
    for item in prefs[p1]:
        if item in prefs[p2]:
            si[item]=1

    #得到列表元素的个数
    n=len(si)

    #如果两人没有共同之处,则返回0
    if n==0: return 0

    #对所有偏好求和
    sum1=sum([prefs[p1][it] for it in si])
    sum2=sum([prefs[p2][it] for it in si])

    #求平方和
    sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
    sum2Sq=sum([pow(prefs[p2][it],2) for it in si])

    #求乘积之和
    pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])

    #计算皮尔逊评价值
    num=pSum/n-(sum1*sum2)/(n*n)
    den=sqrt((sum1Sq/n-pow(sum1,2)/(n*n))*(sum2Sq/n-pow(sum2,2)/(n*n)))
    if den==0:
        return 0

    r=num/den
    return r

print(sim_pearson(critics,‘Lisa Rose‘,‘Gene Seymour‘))
时间: 2024-10-27 13:18:39

Note3 :《集体智慧编程》用户相似度计算的相关文章

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

概述: 协作性过滤,是一种目前广泛运用于电子商务.交友网站.在线广告等互联网领域的一项技术.其主要作用是为指定用户在广大的用户群中找到品味相同或者相似的人,从而帮助网站针对性的推荐产品给特定的用户,与此同时,用户本人也可以从一堆纷繁复杂的信息中,迅速找到自己喜欢的.感兴趣的那部分信息. 其主要有两种实现方法,一种是基于用户的(user-based),即通过分析用户间的相似性,生成最近的邻居,将邻居中“得分”最高的项目推荐给用户:另一种是基于物品的(item-based),即通过分析用户群体对物品

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

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

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

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

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

本文主要介绍一种非常流行的分类算法:决策树分类算法. 例子:一个网站上有多少用户会愿意为某些高级会员功能而支付费用. 步骤一:导入数据: 新建一个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-4章)

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

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

准备开题报告了,先要熟悉一下领域范围,<集体智慧编程>参考一下论点.简单的思路是看一下哪个话题最热门,用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

集体智慧编程:第二章,推荐算法

有一个网站,允许用户对她看过的电影打分.一个可能的结果是: 用户1:{电影1=5:电影2=3:电影3=4} 用户2: 用户3: 省略其他用户. 现在网站向一个用户Jack推荐电影,最直接的方式是,找出与Jack品味最接近的人,也就需要把所有用户按照他们与jack的相似度排序. 怎么计算相似度呢? 第一种方式是向量距离,也就是常用的(x1-x2)^2+(y1-y2)^2开根号. 第二种方式是pearson相关系数,利用的是斜率,比如jack喜欢打高分(A:5,B:4)tom喜欢打低分(A:3,B:

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

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