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

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

这里简单讲解一种基于用户相似度的简单的经典算法——欧里几得距离算法。

欧里几得距离指的就是平面上的两个点的距离,即是如下方式计算:

扩展到N维的空间上,两个点的距离为:

那么,假定两个购物者X,Y,他们都购买了某一件物品,或者都没有购买某一件物品,那么该点的距离为0,如果只有一人购买了,那么距离为1,通过计算他们所买的所有物品的距离,就可以计算处X和Y的距离distance(X,Y)

可以通过以下程序来实现:

#!/usr/bin/python
#data
x_user={‘pen‘:1,‘pencil‘:0,‘knife‘:1,‘notebook‘:1,‘book‘:0}

y_user={‘pen‘:0,‘pencil‘:0,‘knife‘:1,‘notebook‘:1,‘book‘:0}

#calculate distance
from math import sqrt
def distance(person1,person2):
        dis=0
        dis=sum([pow(person1[item]-person2[item],2)
                for item in person1])
        return sqrt(dis)

print distance(x_user,y_user)

初始距离,即是最小距离为0.对于相通的商品,0表示没有购买,1表示购买了的。通过计算,得知X和Y的距离为1。

这样计算存在一个问题,对于不同数目的商品,计算出来的距离会不在同一个范围内,所以需要对结果进行处理。相似度在0-1的范围内,越大表示相似度越高。那么相似度公式为:

经过这样的处理,就可以保证相似度和距离成反比,且保持在0-1的范围内。

代码修正如下:

#!/usr/bin/python
#data
x_user={‘pen‘:1,‘pencil‘:0,‘knife‘:1,‘notebook‘:1,‘book‘:0}

y_user={‘pen‘:0,‘pencil‘:0,‘knife‘:1,‘notebook‘:1,‘book‘:0}

#calculate distance
from math import sqrt
def distance(person1,person2):
        dis=0
        dis=sum([pow(person1[item]-person2[item],2)
                for item in person1])
        return 1/(1+sqrt(dis))

print distance(x_user,y_user)

注释:

pow()函数---次方
sqrt() ---一个非负实数的平方根函数
dictionary: 字典(即C++标准库的map)
dict = {‘ob1‘:‘computer‘, ‘ob2‘:‘mouse‘, ‘ob3‘:‘printer‘}
每一个元素是pair,包含key、value两部分。key是Integer或string类型,value 是任意类型。
键是唯一的,字典只认最后一个赋的键值。
[process_item for item in some_list_or_tuple if condition] 
这种语句就可以得到一个list,

比如想得到每个list中每个item加倍的list 
>>> l = [1, 2, 3, 4] 
>>> l 
[1, 2, 3, 4] 
>>> l2 = [i * 2 for i in l] 
>>> l2 
[2, 4, 6, 8]

如果在加倍的同时想价格条件判断,符合条件的不在结果中,比如大于2的才加倍,可以这样写 
>>> l3 = [i * 2 for i in l if i > 2] 
>>> l3 
[6, 8]

sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]])

明白了这个这个表达式就很好理解 
sum()里的这个参数就是一个list,[pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]] 
对原list(prefs[person1])的每个item进行求值pow(prefs[person1][item]-prefs[person2][item],2),把这个结果作为新的list的一项,当然还需满足条件if item in prefs[person2]

------------------------------------------

此时,计算出的相似度为0.5

以上只是欧里几德方法的一种简单实现,这种算法精度不是很高,还有很多几个可以提高的方面:

1、对于每个物品的距离,可以更加精确,不只是0或者1,可以是0-5之间的值

2、不同物品可能贡献的权值不一样,例如有些物品很多人都喜欢,有些物品很少有人喜欢,也可以根据物品的受欢迎程度赋予不同的权值来提高精度。

参考:?http://blog.chinaunix.net/uid-21718047-id-3220140.html

以及《集体智慧编程》

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

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

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

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

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

集体智慧编程_第二章(提供推荐)_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的 很多接口已经发生了改变,这

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

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

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

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

集体智慧编程——推荐系统(2)

步骤三:为评论者打分 既然我们已经有了对两个人进行比较的函数,下面就可以编写程序,根据指定人员对每个人进行打分,并找出最接近的匹配结果了.在本例中,我们对找寻对与自己相似评委的影评者感兴趣,这样我们就知道在选择影片时应该采纳谁的建议了. def topMatches(prefs,person,n=5,similarity=sim_pearson): scores=[(similarity(prefs,person,other),other) for other in prefs if other

《集体智慧编程》 第三章 发现群组 笔记儿

啦啦啦聚类算法~ 我刚看到这一章的时候内心是崩溃的,许多傻瓜软件点一下鼠标就能完成的事儿,到书里这一章需要许多行代码来完成,也说明了,学数据挖掘,算法real重要.. 本章需要安装: feedparser(第二章安装pydelicious已经安装过了,pip install即可) BeautifulSoup,我也不记得自己是怎么装上的了,据说可以easy_install,大家试一试. PIL,下载地址:http://pythonware.com/products/pil/ 还涉及到一些正则表达式